3>&1は4>&3 5>&3などを意味しますか?


31

期待する

echo foo | tee /proc/self/fd/{3..6} 3>&1

/ proc / self / fd / 4のようなエラーで失敗する:そのようなファイルやディレクトリなどはありませんが、驚いたことに、それは出力します

foo
foo
foo
foo
foo

それ3>&1は私が3他のものに変更した場合に機能しないことを除いて、以下のすべての記述子が標準出力にリダイレクトされるようです

$ echo foo | tee /proc/self/fd/{3..6} 4>&1
tee: /proc/self/fd/3: No such file or directory
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo
$ echo foo | tee /proc/self/fd/{4..6} 4>&1
tee: /proc/self/fd/5: No such file or directory
tee: /proc/self/fd/6: No such file or directory
foo
foo

この動作の説明はありますか?

回答:


31

strace は、この一連のシステムコールを示しています。

$ strace -o strace.log tee /proc/self/fd/{3..6} 3>&1
...
$ cat strace.log
...
openat(AT_FDCWD, "/proc/self/fd/3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
openat(AT_FDCWD, "/proc/self/fd/4", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 5
openat(AT_FDCWD, "/proc/self/fd/5", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6
openat(AT_FDCWD, "/proc/self/fd/6", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 7
...

最初の行が開い/proc/self/fd/3て、次に使用可能なfd番号4 /proc/self/fd/3が割り当てられます。これは特別なパスです。これを開くと、fd 3の複製に似た効果があります。fd4は、fd 3と同じ場所(tty)を指します。

同じことが、連続するopenat()呼び出しごとに発生します。ほこりが落ち着くと、fds 4、5、6、7はすべてfd 3の複製になります。

  • 1→tty
  • 3→tty
  • 4→tty
  • 5→tty
  • 6→tty
  • 7→tty

3>&1リダイレクトは重要ではないことに注意してください。重要なのは/proc/self/fd/NNがすでに使用されている場所を開くようにティーに要求していることです。代わりに3>&1tから始めても、同じ結果が得られるはずです/proc/self/fd/2。どれどれ:

$ echo foo | tee /proc/self/fd/{2..6}
foo
foo
foo
foo
foo
foo

確認しました!同じ結果。

同じfd番号を何度も繰り返すこともできます。fd 6を押しても同じ結果が得られます。最後のファイルに到達するまでに、6へのジャンプを可能にするのに十分な記述子が開かれています。

$ echo foo | tee /proc/self/fd/{2,2,2,2,6}
foo
foo
foo
foo
foo
foo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.