OK、そう...
質問へのコメントで述べたように、0とperl
終了理由があります。障害が発生して終了するには、ファイルを開くことができない場合には、die
(明示的にはexit
のステータスが0以外)にする方法を見つける必要があります。
しかし、perl -p
は、1行の周りにループをラップするので、すべての行でテストを繰り返す必要はありませんか?はい、できます! perldoc perlrun
は、BEGIN
とEND
ブロックを使用して、ループ実行の前後に制御できることを示しています。
しかし、まだファイルが正常に開かれたかどうかを判断する方法が必要です。これを行うには、<>
によって使用されるファイルハンドルの名前を知る必要があります。perldoc perlvar
は、ARGV
と呼ばれています。
しかしARGV
が、それが読み出さだときのみ(確実に)魔法であるので、我々はそれはファイルが欠落している場合でも、定義された常にだ、それが原因で(私の迅速なテストで)定義されたのかどうかをテストすることはできません。だから我々はそれから読む必要があります。そして、最初の行が失われます。しかし、これはファイルの先頭に戻ってseek
で簡単に修正されています。
TL; DR、すべてその結論:これはまだ100%完璧ではないこと
echo before && \
perl -pe 'BEGIN { exit 1 unless <> ; seek ARGV,0,0 } s/foo/bar/g' -i qux && \
echo after
注意。ファイルが存在する場合はdie
になりますが、空です。 defined <>
をチェックしてもこの欠陥が修正されず、<> ; die unless ARGV
にすると、<>
がファイルが存在しない場合はSTDIN
から読み取られます。空のファイルを正しく検出する方法を誰かが持っているなら、私はそれについて聞くことに非常に興味があります!
あなたはちょうど 'echo && test -f qux && ...' – dsm
@dsm yeahは良い回避策のようです、ありがとう – newguy
インタープリタ(Perl)が(1行)それが実行されたプログラム。成功(0)以外のものを返す理由はありません。 1つのライナーの代わりにスクリプトを呼び出す場合は、それを「終了1」にすることができます。 – zdim