OS Xでは、Linuxを除いてサポートされているすべてのシステム/dev/fd/xと同様に、opening はを行うようなものdup(x)であり、結果のfdはfd xと同じオープンファイルの説明を指し、特にファイル内のオフセットは同じになります。
Linuxはここでは例外です。Linuxでは、/dev/fd/xはへのシンボリックリンクで/proc/self/fd/xあり/proc/self/fd/x、fd xで開いているファイルへの疑似シンボリックリンクです。Linuxでを実行するとopen("/dev/fd/x", somemode)、で開いたのと同じファイルに新しい開いたファイルの説明が表示されxます。取得した新しいfdは、fd xとはまったく関係ありません。特に、オフセットはファイルの先頭にあり(O_APPENDもちろん、ファイルを開く場合を除く)、モード(読み取り/書き込み/追加...)はfd xのモードとは異なる場合があります(取得することもできます) fd xにあるものとはかなり異なるもの、たとえば反対のモードでパイプを開くときのパイプのもう一方の端)(つまり、open()できないソケットなどでは機能しません)。
したがって、Linuxでは、
exec 5<> file
echo test >&5
fd 5のオフセットはファイルの最後にあります。もし、するなら
cat <&5
あなたは何も得ません。
それでもあなたがするとき:
cat /dev/fd/5
あなたが見るtestためcatの新しい読み取り専用にfdを取得しfile5をfdに無関係。
他のシステムでは、
cat /dev/fd/5
cat fd 5の複製であるfdを取得するため、ファイルの最後にオフセットが残っています。
それはで動作する理由は、lessいくつかの理由のため、ということであるlessしlseek()(ないファイルの先頭にそのFDにlseek(1); lseek(0)ファイルがシークであるかどうかを判断するため)。
ここでは、おそらく異なるfdをオフセットにしたい場合は、読み取り用と書き込み用のfdが必要です。
exec 5< file 9>&1 > file
それとも、もしまだそこにファイルを再度開く、または実行する必要がありますlseek()ようにless行います。
ksh93そして、zsh組み込みの持つ唯一のシェルですlseek()けれどもオペレーター:
cat <&5 <#((0)) # ksh93
{sysseek 0; cat} <&5 # zsh, zmodload zsh/system to enable that builtin
または:
cat /dev/fd/5 5<#((0)) # ksh93
sysseek -u 5 0; cat /dev/fd/5 # zsh