私浮気スクリプトは任意の色で任意の文を出力します。今コマンドを入力するたびに実行したいと思います。
私はこれをtrap "~/flirt.sh" DEBUG
この.bashrc
目的に使用しますが、小さな問題があります。
for i in 1; do
echo $i
done
走る浮気2回使用すると、for i in {1..2}
出力はスクリプトの2倍と1になり、次にスクリプトの2倍と2が続きます。例えば、ループ内の各コマンドに対してスクリプトを2回実行します。。コマンド(スクリプト)を実行する方法を探しています。一度Enterキーを押したとき今後私が入力したコマンドは、次のように実行を開始します。
# 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
どんな提案がありますか?
答え1
各プロンプトに対してのみコマンドを実行したいという点をコメントで明確にしました。直接確認できないのはbash
」Enterキーを押した後に入力したコマンドが実行される前に[...]コマンドを実行する方法しかし、この問題はtrap '…' DEBUG
。
以下は2つの提案です。
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 がある場合、arg コマンドは、すべての単純なコマンド、コマンド、コマンド、コマンド、すべての算術コマンドの前、およびシェル関数で実行される最初のコマンドの前に
DEBUG
実行されます。for
case
select
for
したがって、ここでできることは、トラップに各
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