;
、、、または演算子の相対バインディング優先順位を知っています&
。&&
||
バッシュ文書。
しかし、パイプが私に近づくと、&&
結束力を理解するのが難しくなり、正しい命令を偶然見つけたり、単にあきらめたりします。
|
上記>
と比較して、バインディングの優先順位は何ですか?
私が混乱している例:
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;}
に近いです。if
then
else
- 中かっこ構文には次のものがあります。〜しなければならない次のスペース
{
の前にある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
x=1 | od -ab
or のようなものがls -laR | z=0
構文的に有効です。
パイプ1 && パイプ2 || パイプ3bashはこれを「リスト」と呼び、POSIXはそれを「AND-ORリスト」と呼びます。同様に、単一の「パイプ」または単一の「単純コマンド」も、ANDまたはORを含まない場合でも、「AND−ORリスト」とみなされる。
そしてまたはリスト1 & そしてまたはリスト2 ; そしてまたはリスト3命名法が少し矛盾し始めました。 Bashはまた、これらの「リスト」を呼び出します。 POSIXはこれを「リスト」、「複合リスト」、および(まれに)「用語」と呼びます。同様に、単一の「AND-ORリスト」、「パイプライン」、または単一の「単純コマンド」も含まれていない場合でも、「リスト」と見なされます。
&
または;
。(化合物一覧)そして
{ 化合物一覧;}フロー制御コマンド(`for`、`if`-`then`-`else`、`while`など)を「複合コマンド」と呼びます。
上記の例ではA
、およびパイプでB
解釈するC
のが最も適しています。 「パイプ」は単一の「簡単なコマンド」であり、パイプを含める必要はありません。