3

ウェブカメラを使用して人の顔の写真を撮るプログラム ( grabface ) があり、次のように機能するシェル スクリプト ラッパーもあります。

コマンド ラインでは、実行するプログラムの名前とそのコマンド ライン引数をスクリプトに指定します。次に、スクリプトは指定されたコマンドを実行し、終了コードをチェックします。エラーが発生した場合、grabfaceプログラムが実行され、ユーザーの驚いた顔がキャプチャされます。

これはすべて非常にうまく機能します。しかし問題は、ラッパー スクリプトを常に使用しなければならないことです。コマンドがシェルに入力されるたびに、このスクリプトを自動的に実行する方法はありますか? または、プログラムの実行後に特定のプログラムを自動的に実行する他の方法はありますか?

ソリューションは bash で機能することが望ましいですが、他のシェルでも問題ありません。これは、シェルのソース コードを少し調整するだけで実現できることはわかっていますが、それは最後の手段です。

これを拡張して、シェルの外部 (デスクトップ環境など) から起動されたプログラムでも動作するように拡張することは、おそらくさらに難しいことですが、これは難しすぎるかもしれません。

編集:すごい!bash はとても簡単だったので、他のシェルはどうでしょうか?

4

4 に答える 4

5

Bash では、引数を指定してtrap コマンドERRを使用して、実行されたコマンドがゼロ以外を返すたびに、指定されたコマンドを実行できます。

$ trap "echo 'エラーが発生しました'" ERR
$ touch ./can_touch
$ touch ./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa
タッチ: `./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa' にタッチできません: そのようなファイルまたはディレクトリはありません
エラーがありました

traptrapはセッション全体に影響するため、セッションの開始時に が呼び出されるようにする必要があり.bashrcます.profile

于 2010-01-12T12:24:17.630 に答える
2

私がfalseを持っているところにあなたのコマンドを代入してください。
false || echo "It failed"

成功したときのように、反対のことをしたい場合は、trueの代わりにコマンドを入力してください:
true && echo "It succeeded"

于 2010-01-12T13:14:14.457 に答える
2

Bash が認識するその他の特別なtrapシグナルは、DEBUG、RETURN、EXIT、およびすべてのシステム シグナル (を使用して一覧表示できますtrap -l) です。

Korn シェルには同様の機能があり、Z シェルにはより広範なトラップ機能があります。

ところで、コマンド ラインの場合、Bash でプロンプトが発行されるたびに実行されるスクリプトまたはコマンドに PROMPT_COMMAND 変数を設定すると便利な場合があります。

于 2010-01-12T12:49:34.560 に答える
1

ユーザーの.profileに次を追加します。

trap grabface ERR
于 2010-01-12T12:24:40.413 に答える