Bash
提示後執行命令
我創建了一個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
.這裡有兩個建議給你
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"'
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 $
- 無指令時不觸發
添加一個簡單的檢查
$BASH_COMMAND
可以防止未觸發trap 'cmd="$BASH_COMMAND"; [[ "$cmd" != "$PROMPT_COMMAND" ]] && echo ~/.Flirt.sh' DEBUG