POSIX 2013では:
「簡単なコマンド」は、一連のオプションの変数割り当てとリダイレクト、順序に関係なく、オプションで次の単語とリダイレクト、制御演算子によって終了します。
Bashのマニュアルから:
単純なコマンドは、最も一般的に使用されるコマンドです。これは単にスペースで区切られた単語であり、シェルの制御演算子の1つで終わります。
私はPOSIX定義がBash手動定義よりも優れていると思います。しかし、POSIXの定義についてはまだよくわかりません。
私が正しい場合、単純なコマンドの終了制御演算子はそのコマンドに属していませんか、それとも属していますか?
定義の2つの「リダイレクト」は単純なコマンドですか?
「一連のオプションの変数割り当てとリダイレクト」で変数を割り当てた後、「リダイレクト」は何をしますか?変数の割り当てはstdoutやstderrには書き込まれません。そうですか?
「任意の順序でオプションの変数を割り当ててリダイレクトするシーケンス」では、「どの順序でも」とはどういう意味ですか?
この定義は、単純なコマンドに対してどのくらいの可能性を示唆していますが、その可能性は何ですか?
POSIXとBashの単純なコマンドの概念は同じですか?
ベストアンサー1
Gregの答えに追加:
うん、グループリダイレクト 同じ単純なコマンドに属します。
入力(stdin)と出力(stdout)がリダイレクトされ、コマンドを実行するときは次のようにします。
cmd パラメータ1 パラメータ2 <ファイル1 >ファイル2
一部の人(少数)は次のように主張します。
<ファイル1 cmdパラメータ1 パラメータ2 >ファイル2
入力を指定する方が直感的だと信じているため、変更されます。それから行動、そしてそれから出力。しかし、以下はすべて同じです。
<ファイル1 >file2 cmd パラメーター1 パラメーター2
>file2 cmd パラメーター1 パラメーター2 <ファイル1
ガイドライン >ファイル2パラメータ1 <ファイル1パラメータ2
いいえ上記の方法のいずれかを使用すると悪い例になります。
重要なのは、リダイレクトがコマンドの最初の単語(またはコマンドのすべての単語)の前または後に表示される場合がありますが、同じ方法で処理されることです。
環境変数がそのコマンドの期間(範囲)の間にのみ設定されるように、コマンドの前に変数割り当てが表示されることがあります。例えば、
TZ=GMT0 ls -l
修正時間(GMT)を表示してファイルを一覧表示します。 「順序に関係なく、オプションの変数の割り当てとリダイレクト」は、
TZ=GMT0 ls -l > ls_output_file
TZ=GMT0 > ls_output_file ls -l
> ls_output_file TZ=GMT0 ls -l
すべて同じです。また、いいえ最初のものを除いて何かを使用してください。
変数の割り当てに焦点を当てます。できないコマンドの最初の単語の後に表示されます。もしそうなら、コマンドの引数として扱われます。たとえば、構文を見てください
dd
。変数の割り当てはstdoutやstderrには書き込まれません。そうですか?
単純で継続的なデータ割り当ては何もしません(シェル内の履歴は含まれません)。ただし、コマンド置換はコマンドを実行します。
CURRENT_DATE=$(date +%Y%m%d)
コマンドを実行すると、date +%Y%m%d
標準出力がシェルのパイプにリダイレクトされ、シェルは出力をキャプチャしてコマンドラインに含めます。ただし、コマンドの標準エラーはdate
依然としてシェルの標準エラーです。と言うと、日付指定構文はサポートされていないOLD_DATE=$(date --date"three days ago")
ため、画面にエラーメッセージが表示されます。date
もちろん言えば抑制できますが、OLD_DATE=$(date --date "3日前" 2> /dev/null)
しかし、そう言えばそうではありません。
OLD_DATE=$(date --date "3日前") 2> /dev/null
または
2> /dev/null OLD_DATE=$(date --date "3日前")
「どんな順序でも」とは、私が最後に述べた内容と一緒に次の事実を意味します。
TZ=GMT0 列=132 ls -l
等しい
列=132 TZ=GMT0 ls -l
(異常な場合があります。そこまで行く危険はありません。)