Bash

提示後執行命令

  • February 7, 2022

我創建了一個flirt.sh腳本,它只輸出一個隨機顏色的隨機句子,現在我希望每次輸入命令時都執行它

我用於trap "~/flirt.sh" DEBUG.bashrc目的,但有一個小問題:

for i in 1; do
   echo $i
done

執行flirt.sh兩次,如果我使用for i in {1..2}輸出將是腳本的 2 次和 1 次,然後是腳本的另外 2 次和 2 次,例如,對於循環中的每個命令,它會執行腳本 2 次。我正在尋找一種方法來執行命令(腳本)在我按下輸入鍵之後和我輸入的命令開始執行之前,所以是這樣的:

# Nothing typed so script won't be executed
$
# Script and command will be executed
$ ls
Hello from flirt.sh!

Documents Downloads
...

# Script will be executed only once
$ for i in {1..2}; do echo $i; done
Hello from flirt.sh!

1
2

請問有什麼建議嗎?

您已在評論中澄清說,您確實希望該命令僅針對每個提示執行。不能直接使用的bash是“執行命令的方法$$ … $$在我按下輸入鍵之後,在我輸入的命令開始執行“之前”。但是,可以使用trap '…' DEBUG.

這裡有兩個建議給你

  1. PROMPT_COMMAND. 此功能在每個提示之前立即執行一個命令。bash(參見)的文件man bash寫道,

**PROMPT_COMMAND**如果設置,則在發出每個主要提示之前將該值作為命令執行。

例子

PROMPT_COMMAND='date'
PROMPT_COMMAND='printf "Date: %s Id: %s\n" "$(date)" "$(id -un)"'
PROMPT_COMMAND='echo "Command 1"; echo "Command 2"'
  1. trap '…' DEBUG. 正如您已經發現的那樣,這將允許您在命令執行之前立即執行它。該文件為trap,

如果 sigspec 是DEBUG,則命令 arg 在每個簡單命令、for命令、case命令、select命令、每個算術for命令之前執行,並且在 shell 函式中執行的第一個命令之前執行

所以,我們可以在這裡做的是讓陷阱Flirt.sh在每個提示之後只執行一次命令,在第一次之後使用切換來抑制它,直到收到下一個提示。

PROMPT_COMMAND='_trace=yes'
trap '[[ "$_trace" == "yes" ]] && echo Flirt.sh; _trace=no' DEBUG

在這裡,我已用作您的腳本echo Flirt.sh的替代品。flirt.sh

範例會話

$ date
Flirt.sh
28 Jan 2022 16:57:51
$ for i in 1 2 3; do echo i=$i; done
Flirt.sh
i=1
i=2
i=3
$
  1. 無指令時不觸發

添加一個簡單的檢查$BASH_COMMAND可以防止未觸發

trap 'cmd="$BASH_COMMAND"; [[ "$cmd" != "$PROMPT_COMMAND" ]] && echo ~/.Flirt.sh' DEBUG

引用自:https://unix.stackexchange.com/questions/688315