ファイル記述子6から読み取るには、<&6
or </dev/fd/6
(別名/proc/self/fd/6
)を使用できます。通常、どちらも同じように機能します。しかし、そのファイル記述子がたまたまソケットである場合、奇妙なことが起こります。例えば:
$ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345
lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010]
cat: /dev/fd/6: No such device or address
ここでls
は、記述子が実際に存在することを示しています。ただし、この方法ではデータにアクセスできません。cat <&6
代わりに使用すると、すべてが再びうまく機能します。
ファイル記述子にアクセスする両方の方法の違いは何ですか?
変数で番号が指定されている場合、記述子にアクセスするための良い方法はありますか?(</dev/fd/$fd
動作しますが、<&$fd
動作しません。)
(上記の状況はLinuxでは観察できますが、OpenBSDでは観察できません。-そのファイル記述子はそこで通常の文字デバイスであるようです。)