File-Descriptors
從文件描述符讀取失敗
這個問題是關於文件描述符的讀寫。請參見以下範例:
#!/bin/sh file='somefile' # open fd 3 rw exec 3<> "$file" # write something to fd 3 printf "%s\n%s\n" "foo" "bar" >&3 # reading from fd 3 works cat "/proc/$$/fd/3" # only works if the printf line is removed cat <&3 exit 0
該腳本輸出:
foo bar
預期輸出:
foo bar foo bar
打開並寫入文件描述符成功。通過閱讀也是如此
proc/$$/fd/3
。但這不是便攜的。cat <&3
不輸出任何東西。然而,當文件描述符未被寫入時(例如取消註釋該printf
行),它可以工作。為什麼不起作用
cat <&3
以及如何從可移植的文件描述符(POSIX shell)中讀取全部內容?
cat <&3
完全按照它應該做的事情,即從文件中讀取,直到到達文件末尾。當您呼叫它時,文件描述符上的文件位置是您上次離開它的位置,即文件末尾。(有一個文件位置,而不是單獨的用於讀取和寫入的位置。)
cat /proc/$$/fd/3
不做同樣的事情cat <&3
:它在不同的描述符上打開同一個文件。由於每個文件描述符都有自己的位置,並且在打開文件進行讀取時位置設置為 0,因此該命令會列印整個文件並且不會影響腳本。如果您想讀回您寫的內容,您需要重新打開文件或倒回文件描述符(即,將其位置設置為 0)。在 POSIX shell 和大多數 sh 實現中都沒有內置的方法(在 ksh93 中有一個)。只有一個實用程序可以搜尋:
dd
,但它只能向前搜尋。(還有其他實用程序可能會向前跳過,但這無濟於事。)我認為唯一可移植的解決方案是記住文件名並根據需要多次打開它。請注意,如果文件不是正常文件,您可能無論如何都無法向後搜尋。