シェルスクリプトを使用して実行されたコマンドが失敗するたびにシェルスクリプトが失敗するようにします。
通常、私はそれを以下で行います:
set -e
set -o pipefail
(通常、私set -u
も追加します)
問題は、上記のいずれもプロセス置換では機能しないことです。このコードは「ok」を出力し、リターンコード= 0で終了しますが、失敗させたいと思います。
#!/bin/bash -e
set -o pipefail
cat <(false) <(echo ok)
「pipefail」に相当するものがありますが、プロセスの代替はありますか?コマンドの出力をファイルであるとしてコマンドに渡す他の方法がありますが、これらのプログラムのいずれかが失敗するたびにエラーが発生しますか?
貧乏人の解決策は、これらのコマンドがstderrに書き込むかどうかを検出することです(ただし、一部のコマンドは成功したシナリオでstderrに書き込みます)。
posix準拠のもう1つのソリューションは、名前付きパイプを使用することですが、コンパイル済みコードからオンザフライで構築されたonelinersとして、それらのコマンドを使用するプロセス置換を実行する必要があり、名前付きパイプを作成すると物事が複雑になります(余分なコマンド、削除など)
$$
プロセス置換を使用するコマンドは「非シェル」コード(python)から生成されるコマンドパイプライン内で実行されるため、コマンド置換は実行されません。おそらく、Pythonでサブプロセスを作成し、プログラムでパイプする必要があります。
kill -2 0
。
mkfifo pipe; { rm pipe; cat <file; } >pipe
。読者が開くまでそのコマンドがハングしますpipe
それがないシェルですのでopen()
ので、すぐに読者があるとしてpipe
用FSリンクがpipe
あるrm
D」と、その後cat
のコピーがそのパイプのシェルの記述に出てINFILE。あなたは、プロセス、サブのうち、エラーを伝播する場合と、とにかく、やる: <( ! : || kill -2 "$$")