問題タブ [bash-trap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - /dev/null からのリダイレクトによって供給される ffmpeg を含む while ループを終了するためにトラップを使用する方法は?
ここで、完了までに長い時間がかかるループ呼び出しプロセスを発見しました。どうすればそれから抜け出すことができますか?find から ffmpeg cli [HandBrakeCLI] を呼び出す while ループへのパイピングは、複数の入力ファイルを処理しません。これは、ffmpeg にはすべての入力リストを一度に「食べて」ループを「飢えさせる」という癖があるためです。
解決策は、 http://mywiki.wooledge.org/BashFAQ/089に従って /dev/nullからリダイレクトすることでした。これは正常に機能します。ただし、元の問題と解決しようとしている質問に戻ります。
/dev/null には、HandBrakeCLI にフィードするすべてのファイルの完全なリストが含まれているため、ctrl-c だけではループを終了するのに十分ではありません。
トラップのさまざまな順列を試しましたが、HandBrakeCLI が現在の入力を処理してから次の入力に移るのを停止する以外に何もすることができません。ループをすぐに終了する代わりに、HandBrakeCLI 行の直後に mv も処理します。
1. ctrl-c または kill コマンドですべてを終了するにはどうすればよいですか? 2. (1.) で処理されない場合、ループ内の mv が実行されないようにするにはどうすればよいですか?
質問に対処するために、これはコードの簡略化されたバージョンです。
bash - 再帰トラップ呼び出しが発生しないのはなぜですか?
unions.sh という bash スクリプトがあります。
./unions.sh -h を実行すると、出力は
ここで疑問があります。ヘルプ関数で終了を使用すると、_cleanup 関数が呼び出されました。_cleanup 関数にも同じ出口があります。再び _cleanup 関数を呼び出さないのはなぜですか?
linux - bashでRETURNトラップを作成してリターンコードを保持するには?
以下は、私が書いているスクリプトの簡略化されたスキームです。プログラムはさまざまな方法でパラメーターを取得する必要があるため、いくつかの関数に細かく分割されています。
問題は、より深い関数からの戻り値のチェーンロードが、メッセージを表示するために結果をチェックするトラップで壊れることです。
どのように動作するか:
この考え方は、チェックが失敗した場合、そのリターン コードも強制的に返され、それが今度は の条件check_params()
をトリガーするというものです。しかし、トラップは 0 を返します。|| ask_for_params
setup()
スクリプトをそのまま実行しようとすると、次のように表示されます。
これは、悪い結果がトラップ(!) を引き起こしたが、それを設定した親関数が結果を渡さなかったことを意味します。
私が試したハックを設定しようとして
- retval をグローバル変数として
declare -g retval=$?
設定return_trap()
し、トラップを設定する行でその値を使用します。変数は設定されています ([ -v retval ]
正常に返されます) が、値がありません。面白い。 - 、 の外側に置き
retval=Eeh
、通常のパラメーターとして設定します。いいえ、関数内はグローバル変数の値を設定せず、「Eeh」のままです。いいえ、指示はありません。デフォルトではグローバルとして扱われるべきです。にとを入れて、 の最後に を付けて印刷すると、3 が表示されるはずです。少なくとも私はそうします。予想通り、ここでは何の違いもありません。check_params()
return_trap()
$?
retval
local
test=1
check_params()
test=3
check_a_param()
echo $test
setup()
declare -g
- 多分それは機能の範囲ですか?いいえ、それもありません。
return_trap()
一緒に移動しdeclare -g retval=Eeh
ても違いはありません。 最新のソフトウェアが衰退を意味するとき、古き良きファイルへの書き込みに頼る時が来ました。
retval=$?; echo $retval >/tmp/t
inを使用して retval を /tmp/t に出力し、return_trap()
それを読み取ります。trap "return_trap; trap - RETURN; return $(</tmp/t)" RETURN
ここで、ファイルから数値を読み取る最後の return ディレクティブが実際には 3 を返すことが最終的にわかります。しかし、check_params()
それでも 0 を返します!
コマンドの引数trap
が厳密に関数名である場合、元の結果が返されます。元のものであり、return_trap()
返されるものではありません。結果をインクリメントしようとしましたが、それでも 3 になりました。「なぜそんなにトラップを設定解除する必要があるのですか?」という質問もあるかもしれません。check_params()
別の関数から呼び出された場合でも、毎回トラップがトリガーされる別のバグを回避するためです。RETURN のトラップはローカルなものであり、デバッグまたはトレース フラグが明示的に設定されていない限り、別の関数に継承されませんが、実行間でトラップが設定されているように見えます。または、bash はそれらのトラップを保持します。このトラップは、特定の関数から check_params() が呼び出された場合にのみ設定する必要がありますが、トラップが設定解除されていない場合は、毎回トリガーされ続けますcheck_a_param()
の内容に関係なく、ゼロより大きい値を返しますFUNCNAME[1]
。
ここで私はあきらめます。なぜなら、私が今見ている唯一の出口は、各|| return $?
inの前に呼び出し関数のチェックを実装することだからcheck_params()
です。でも目が痛くなるくらい醜い。
私はそれを追加するだけかもしれません.trapを設定$?
する行では、常に0を返します.local
retval
return_trap()
retval
実際に設定されているかどうかに関係なく 0が出力されますが、
「未設定」と出力されます。
GNU bash、バージョン 4.3.39(1) リリース (x86_64-pc-linux-gnu)
linux - ssh 経由で Ctrl_C を送信する
多くのサーバーでautofsがハングし、プロセスがマウントにアクセスしようとしています。リモートホストにsshしている間、キーボードからCrtl+を押すまでハングしますC
Crtlしかし、 +を押すCと、プロンプトが表示されます
ssh 経由でトラップ シグナルを送信しようとしていますが、これもハングします。
この問題を解決するための助け。
bash - プロセスの終了時に SIGCHLD が配信されない
バックグラウンド プロセスの 1 つが終了したことを検出する必要があります。ということで、トラップを設置。run_gui
とrun_ai1
シンプルなexec
機能です。
GUI を閉じても何も起こりません。コマンドは、echo foo
ctrl+c を押した場合にのみ実行されます。
が恋しいのはなぜSIGCHLD
ですか?
bash - bash trap '' vs シグナルを渡すトラップ関数
トラップを使用して子プロセスにシグナルを転送することについて混乱しています。2 つのスクリプトがあるとします。
灰
b.sh
を実行a.sh
して別のウィンドウからプロセス グループを強制終了するとkill -- -PGID
、SIGTERM は無視され、に渡されませんb.sh
。しかしtrap cleanup SIGTERM
、そうすると、SIGTERM は通過して終了しますb.sh
。トラップが信号を渡す場合と渡さない場合があるのはなぜですか?
linux - Bash でトラップが設定されているかどうかを確認する
trap
Bashで(現在のセッションまたはスクリプトで)何が設定されているかを確認する方法はありますか?
理想的には、割り当てられた信号のリストを取得できるようにしたいのですが、trap
それが不可能な場合は、各信号を個別に確認できます。
bash - Bash: SIGNT (ctrl-c) x 回を無視
したがって、このプログラムでは、BASH を使用して、無視またはトラップをCTRL-C複数回 (無限ではない) 実行しようとしています。
現時点では、コマンドを一度無視する方法を知っています。しかし、無視される回数を増減する方法がわかりません。
コード:
ありがとうございました