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を取得しfile
5を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