2011-01-03 8 views
21

私は、ユーザーが入力した、各コマンドの後コンソールからBashコマンドを入力する前後にいくつかのコマンドを実行するには?

echo "foobar"; 

例えば、コマンドを実行したいです。

2つのシナリオ:

  • ユーザがコマンドを入力すると、私のグローバルコマンドを実行する必要があり、ユーザーがコマンドを入力すると、後で彼のコマンドは
  • 実行する必要があり、彼のコマンドを実行しなければなりません、後でグローバルコマンドを実行する必要があります

上記の2つのシナリオを実行するにはどうすればよいですか?

注意:私はこの目的のためにプロンプ​​トを使用したくないです(PS1変数をそのままの状態にしておきます)。

+4

@ajreal、どの別名:

あなたの最初のリクエストを行うには、DEBUG疑似信号をtrapことができますか?すべてのコマンドに別名を付ける必要がありますか? – astropanic

+2

明白なソリューションを使用したいのですが?あなたはいつでもあなたが望むことをする独自のシェルを書くことができます。 –

答えて

15

l0b0が示唆するように、PROMPT_COMMANDを使用して2回目のリクエストを行い、PS1に触れる必要はありません。

trap 'echo "foobar"' DEBUG 
+0

トラップトリックを使用して私は、コマンドの1回前と4回後にコードを実行します。 – trusktr

+0

@trusktr:おそらく、いくつかのコマンドを実行するように 'PROMPT_COMMAND'が設定されていることを意味します。残念ながら、コマンドが実行される前に 'DEBUG'トラップが実行されるので、' PROMPT_COMMAND'の始めにトラップをオフにして、最後にオフにすることはできません。 –

+0

Yikes。それは醜いです。私はバッシュの履歴が端末間で同期されるように何かを実装しようとしていますが、私が何をしても、それを実現することはできません。私はプリコマンド機能(このトラップの例のような)を実装する方法があると、他の端末の最後のコマンドに基づいて履歴を強制的に更新することができると考えました。これまでは、PROMPT_COMMANDを使ってHISTFILEに書き込んだ後に履歴を更新する方法を見つけましたが、少なくとも1つのコマンドが実行されるまで(少なくとも1回はEnterを押してください)、他の端末に反映されません。 – trusktr

8

declare -r PROMPT_COMMAND="echo 'foobar'":プロンプトが表示される直前に実行されます。パイプやコマンドグループなどの各コマンドでは実行されないように注意してください。

これには、ユーザにとって混乱する可能性があるので、何も出力しないコマンドを呼び出すのが理想的です(そうでなければ、出力処理は事実上不可能です)。また、ユーザは利用できません(出力を偽造または破損させないため)。

+0

私はそれが読み取り専用ではないことをお勧めします。また、エスケープを排除することができます: '... = 'echo" foobar "' ' –

+0

おそらく明らかですが、実際にはユーザが入力した直後にグローバルコマンドを実行するわけではありません。まずユーザーコマンドが完了するのを待ちます。 –

関連する問題