2016-12-22 9 views
1

が、私はこの`cat <does_not_exist | perl`は

./preprocess.sh <PARTIAL_SOURCE | perl >FINAL_SOURCE 

のような行がPARTIAL_SOURCEがまだ存在していないにもかかわらず、成功したので、それが失敗するところ成功メイクファイルを持って成功しました。

これはpreprocess.shの癖はありませんが、なぜ最初に失敗しないが、第2成功のbash/shをして

$> cat <does_not_exist && echo ok || echo no 
bash: does_not_exist: No such file or directory 
no 
$> cat <does_not_exist | perl && echo ok || echo no 
bash: does_not_exist: No such file or directory 
ok 

を何かのようですか?

+0

は何ですかあなたの要件?あなたは何を達成しようとしていますか? – Inian

+0

'FINAL_SOURCE'を生成するコマンドの完全な連鎖が成功した場合にのみ、' FINAL_SOURCE'を書き込む必要があります。 – spraff

+0

あなたの要件は実際にはかなり曖昧です。 'preprocess.sh'は' PARTIAL_SOURCE 'から読み込み、前のコマンドが成功した場合にのみ' perl'コマンドの出力を 'FINAL_SOURCE'にパイプします(ファイルや変数はありません)? – Inian

答えて

2

perlが成功したため、2番目の成功は成功しました。パイプラインの終了コードは、パイプライン内の最後のコマンドの終了コードです。この例では、perlです。空の入力を受け取り、何もしないので、0で終了します。別の例として、これはあまりにも成功し

:あなたがパイプラインの前にそれをテストする必要が

$ a | b | perl && echo ok || echo no 
-bash: a: command not found 
-bash: b: command not found 
ok 

あなたはperlPARTIAL_SOURCE前に実行を取得したくない場合は、準備ができている:

if [ ! -f "$input" ]; then 
    ./preprocess.sh < "$input" | perl >FINAL_SOURCE 
fi 

または準備ができて入力を待つ:

while [ ! -f "$input" ]; do sleep 1; done 
+0

明白なフォローアップ、どうすればそれを失敗させることができますか? – spraff

+0

@spraff私の答えを更新しました – janos

関連する問題