パイプとリダイレクトと分離、結合などのバインディングの優先順位は何ですか?

パイプとリダイレクトと分離、結合などのバインディングの優先順位は何ですか?

;、、、または演算子の相対バインディング優先順位を知っています&&&||バッシュ文書

しかし、パイプが私に近づくと、&&結束力を理解するのが難しくなり、正しい命令を偶然見つけたり、単にあきらめたりします。

|上記>と比較して、バインディングの優先順位は何ですか?

私が混乱している例:

ls _thumbnails/video.mp4.jpg 2>/dev/null 
    && echo "thumbnail already generated. Not regenerating" \
    && exit \
    || ffmpeg_thumbnail_create video.mp4 2>/dev/null \
    && ls _thumbnails/video.mp4.jpg \
    && echo "Thumbnail successfully created" \
    && exit \
    || echo "Thumbnail creation failed" \
    | tee ~/thumbnails.log

上記の目標は、サムネイルがまだ存在しない場合にのみサムネイルを生成することです(私は毎日cronjobを実行します)。そして私はFFMpegのエラーのない大きな出力が好きではありません(Unixではありません)。

他の場合もあるため、プログラムに固有の別々のステートメントまたは特別なオプションを使用するよう提案することは役に立ちません。バインディングの優先順位について知りたいです。

答え1

つまり<、、、、、および対応するバリアントが最も高い>バインディング優先順位(最も厳密なバインディング)を持ち、次は、、、、、|とです。したがって、それだけでパイプすることができます。&&||;&echo "Thumbnail creation failed"tee

少し長い答えは指摘されています最も高い優先順位は実際にはグループ化されており、括弧または中括弧で表現できます。例えば、

A  &&  (B; C)

そして

A  &&  { B; C;}

ほぼ同じ

if A
then
    B
    C
fi

メモ:

  • 角かっこはサブシェルを提供します。つまり、コマンドは子プロセスで実行されBます。Cしたがって、変数の割り当てなどのコマンドはcd 親シェルには影響しません。中括弧で囲まれたコマンドは、コマンドと同じプロセスで実行されますA。したがって、中括弧構造は--構造A && { B; C;}に近いです。ifthenelse
  • 中かっこ構文には次のものがあります。〜しなければならない次のスペース{の前にあるa ;&または改行文字)です}

詳細については、次を参照してください。シェルの制御およびリダイレクト演算子は何ですか?そして「if」が不要な場合はいつですか?(特に私の答え)。

~のためでも詳細については、次を参照してください。bash(1) マニュアルページそして Shellコマンド言語のPOSIX仕様/定義具体的にレッスン 2.9, シェルコマンド そしてセクション 2.10.2, シェル構文規則。これは上記のいくつかのコンテキストを提供しようとする試みです。

  • myVar=42
  • IFS= read a
  • date
  • cd /some/directory
  • ls -laR dir1 dir2
  • cat foo* > /tmp/allfoo
  • ls -laR dir{1,2}
  • find . -type f -name "foo*" -print > /tmp/output 2> /dev/null
  • > newfile
  • [ -f catfood ]
  • exit

すべて「簡単なコマンド」と見なされます。

    • 簡単なコマンド1  |  簡単なコマンド2  |  簡単なコマンド3
    「パイプライン」です。文法は、このような形式的な文法(およびCなどのプログラミング言語)と同様に、ビルディングブロックを作成してその上に構築するため、パイプがなくても単一の「単純なコマンド」は「パイプライン」と見なされます。変数の割り当てにはパイプラインの一部として (意味論的) 意味はありませんが、x=1 | od -abor のようなものがls -laR | z=0構文的に有効です。
    • パイプ1  &&  パイプ2  ||  パイプ3
    bashはこれを「リスト」と呼び、POSIXはそれを「AND-ORリスト」と呼びます。同様に、単一の「パイプ」または単一の「単純コマンド」も、ANDまたはORを含まない場合でも、「AND−ORリスト」とみなされる。
  • このようなことに出会ったとき
      そしてまたはリスト1 &  そしてまたはリスト2 ;  そしてまたはリスト3
    命名法が少し矛盾し始めました。 Bashはまた、これらの「リスト」を呼び出します。 POSIXはこれを「リスト」、「複合リスト」、および(まれに)「用語」と呼びます。同様に、単一の「AND-ORリスト」、「パイプライン」、または単一の「単純コマンド」も含まれていない場合でも、「リスト」と見なされます。&または;
    • 化合物一覧)
    そして
    { 化合物一覧;}
フロー制御コマンド(`for`、`if`-`then`-`else`、`while`など)を「複合コマンド」と呼びます。 

上記の例ではA、およびパイプでB解釈するCのが最も適しています。 「パイプ」は単一の「簡単なコマンド」であり、パイプを含める必要はありません。

関連情報