リダイレクト3>&2と3<&2は違いますか?
違いは何ですか?
2
3>&2で入力が開かなかったため、エラーが発生する必要がありますか?
比較する:
{ seq 20 1<&2; } 2>/dev/null
{ seq 20 1>&2; } 2>/dev/null
編集:答え
どちらのコマンドも1と2の同じ反復を実行します。出力:
$ strace -f -e trace=dup,dup2 -o o2 sh -c 'seq 20 1>&2'
両方のコマンドは同じです(PID番号を除く)。
答え1
dup2(2, 3)
いいえ、両方はまったく同じです。シェルは最終的3>&2
にと3<&2
。その後、fdは3
最終的に同じことを指します。ファイル説明を開くfd2と同じです。モード/方向には影響しません。ファイル説明を開く。開いたファイル記述のモード/方向を変更できません。
x>&y
と演算子はx<&y
省略された場合にのみ異なります。 (同じ)ですが(同じ)です。x
>&y
1>&y
1<&y
<&y
0<&y
0>&y
答え2
1つは出力を取得するためにstderrをリダイレクトし、もう1つは入力を取得するためにstderrをリダイレクトします。
読み書き用に stderr を開くには、次のように使用できます。
2<>/dev/null
ログインすると、3つのファイル記述子がすべて読み書きできるようになります。
dup()
最初にttyを開いてから2回呼び出すだけです。
注文する
{ seq 20 1<&2; } 2>/dev/null
そして
{ seq 20 1>&2; } 2>/dev/null
最終リダイレクトで書き込むことができるファイル記述子を生成するため、同じです。
電話する場合:
{ truss -o o seq 20 1<&2; } 2>/dev/null
書き込み呼び出しがseq
成功したことがわかります。 btw: 出力はseq
/dev/null に移動します。