標準入力リダイレクトのposix配置(

標準入力リダイレクトのposix配置(

私はいつもコマンドの後にstdinリダイレクトを書きます。なぜなら、コマンドを最初に受け取り、次にリダイレクト(ある場合)する方がより自然に感じられるからです。

some-command < input-file > output-file

長年にわたり、私は人々が流れの方向を得るためにコマンドの前にstdinリダイレクトを書くのを見ました。

< input-file some-command > output-file (or without spaces after < and > )

この注文はPOSIXまたは多くのシェルで許可されていますか(私のFedora 21では、およびbashdash許可されていますtcsh)?kshzsh

ベストアンサー1

この動作は POSIX によって定義されます。ここ:

コマンドが複数のリダイレクト演算子を指定する場合、評価順序は最初から最後までです。

そしてここ:

「単純なコマンド」は、任意の順序で任意の変数割り当ておよびリダイレクトのシーケンスであり、任意にワードおよびリダイレクトが続き、制御演算子によって終了される。

すでにそのようなことが起こっていますボンシェル、POSIXはそれに基づいています。

シェルで解釈される特殊記号を使用して、コマンドを実行する前にコマンドの入力と出力をリダイレクトできます。以下は、単純なコマンドの任意の場所に表示され、コマンドの前または後に来ることができますが、呼び出されたコマンドには渡されません。 (…)

元のBourneシェルとは異なり、POSIXは他の複雑なコマンドの前にリダイレクトを許可しませんwhile … done( … )


リダイレクト順序は、コマンドの動作を制御し、失敗したときに奇妙な結果を得るのを防ぐために重要です。例:

command <input >output

command読み取れない場合input(権限のため存在しません...)、リダイレクトのoutput場所が変わると、空のファイルを作成せずに終了します。

command >output <input

おすすめ記事