プロンプトが表示されたら、コマンドを実行してください。

プロンプトが表示されたら、コマンドを実行してください。

浮気スクリプトは任意の色で任意の文を出力します。今コマンドを入力するたびに実行したいと思います。

私はこれを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

各プロンプトに対してのみコマンドを実行したいという点をコメントで明確にしました。直接確認できないのはbashEnterキーを押した後に入力したコマンドが実行される前に[...]コマンドを実行する方法しかし、この問題はtrap '…' DEBUG

以下は2つの提案です。

  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"'
    
  2. trap '…' DEBUG。すでに見つけたように、コマンドを実行する直前にコマンドを実行できます。文書には次の内容がありますtrap

    sigspec がある場合、arg コマンドは、すべての単純なコマンド、コマンド、コマンド、コマンド、すべての算術コマンドの前、およびシェル関数で実行される最初のコマンドの前にDEBUG実行されます。forcaseselectfor

    したがって、ここでできることは、トラップに各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
    $
    
  3. コマンドがない場合はトリガーされません。

    簡単な確認を追加すると、誤った$BASH_COMMANDトリガーを防ぐことができます。

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

関連情報