Bashのパイプ(|)と論理AND(&&)優先順位

Bashのパイプ(|)と論理AND(&&)優先順位

演算子優先順位を持つクラシックシナリオには、次の行があります。

(cd ~/screenshots/ && ls screenshot* | head -n 5)

そしてそれが解析されたか((A && B) | C)どうか(A && B | C)...

これほぼ公式文書確立されたここパイプがリストに表示されないため、単にテーブルにチェックインすることはできません。

さらに、bashでは(作業の順序を変更できるだけでなく、次のようなこともできます。サブシェルの作成したがって、この行が前の行と同じであると100%確信することはできません。

((cd ~/screenshots/ && ls screenshot*) | head -n 5)

より一般的に知る方法アスパラギン酸アミノ転移酵素バッシュわかりましたか? Pythonには、タスクの順序を簡単に再確認できるようにツリーを提供する関数があります。

ベストアンサー1

cd ~/screenshots/ && ls screenshot* | head -n 5

これは次のとおりです。

cd ~/screenshots && { ls screenshot* | head -n 5 ; }

(これ中かっこはコマンドを一緒にグループ化するため、サブシェルは必要ありません。)。したがって、優先順位は.(より堅固にバインドされている)の優先順位|よりも高くなります。それは、&&||

A && B | C

そして

A || B | C

常に意味BからCへの出力のみを提供。必要に応じて、コマンドを単一のエンティティとして一緒に使用するか、リンクして明確にすること(...)ができます。{ ... ; }

{ A && B ; } | C
A && { B | C ; } # This is the default, but you might sometimes want to be explicit

いくつかの異なるコマンドを使用してこれをテストできます。走れば

echo hello && echo world | tr a-z A-Z

それからあなたは得るでしょう

hello
WORLD

後ろに:tr a-z A-Z大文字で入力してくださいecho world、パイピングだけで自分で通過するのが見られますecho hello


これはいで定義シェル構文、あまり明確ではありませんが、and_or生産(&&/用)は本文にaaが含まれているだけで定義され||ています。pipelinepipelinecommandいいえ組み込みand_or-complete_command本番のみに到達できand_or、最上位レベルと関数やループなどの構造構成内にのみ存在します。

この構文を手動で適用してコマンドの構文解析ツリーを取得できますが、Bash自体は何も提供しません。私は自分で構文解析する以上の機能を実行するシェルを知りません。

シェル構文には、正式にのみ定義される特殊なケースが多数あり、正しく定義することは困難な作業になる可能性があります。 Bash自体も時には間違っています。したがって、実際の状況と理想的な状況は異なる場合があります。

文法を一致させ、ツリーを生成する外部パーサーがあります。私はこれらの外部パーサーを広くお勧めします。モビック、最も信頼できる人になろうとします。

おすすめ記事