コマンドの進行状況を bash スクリプトで表示しています。コマンド出力は zenity --progress にパイプされ、最終的に長時間実行できます。Zenityダイアログをキャンセルした場合、それを中止(そのコマンドを強制終了)したい:
( echo 0; command; echo 100 ) | if ! zenity --progress
then DO_SOMETHING_TO_KILL_command
fi
私が見つけたすべての解決策は次のいずれかです。
一般的に、pgrep、pidof、pkill、killall などを使用して「コマンド」を強制終了します。このような「コマンド」が多数実行されている可能性があるため、これは私が望んでいるものではありません。
「コマンド」の PID を出力する fifo を作成し (command & echo $! >some_fifo; wait)、パイプの後に読み取ります。
解決策 2. は、私が望むことを行いますが、複雑すぎる方法です (たとえば、こちらの例を参照してください(フランス語))。可能であれば、fifos または一時ファイルを避けたいと考えています。せいぜいファイル記述子への出力リダイレクトで実行できるように思えますが、正確な方法はわかりません。
注: リダイレクトを使用したグループ全体のコマンド置換 (例: $( ( ... command& echo >&3 ... | zenity --progress ) 3>&1 ) -- これは、このタイプの場合の一般的なソリューションです -- $(...) はサブシェル全体が完了するまで待機するため、ここでは機能しません。