我在手冊頁中找不到任何內容來zsh
準確解釋以下內容(例如)的作用
exec 3> /tmp/foo
我能找到的所有正確文件都指的是後跟“簡單命令”的exec
形式。 exec
(例如參見man zshbuiltins
, 和man zshmisc
.)(該exec FD>
表格在man zshmisc
,但在我看來的一段話中假設該表格已在其他地方得到完整且正確的記錄。
我查看了所有的熱門作品
man zshall | grep -P '\bexec\b'
……但沒有一個是我正在尋找的。
有人知道缺少文件的良好替代品嗎?
PS:對於我看來“缺少文檔”的一個可能的解釋是,像這樣的表單exec 3> /tmp/foo
實際上是表單“的特殊情況”exec
簡單的指令“。但是,如果是這樣,那麼我想找到解釋(1)例如如何3> /tmp/foo
是一個簡單命令的文檔(如果我在命令行上運行這個“簡單命令”,它只會掛起,直到我點擊^C
) ;以及(2)為什麼腳本中的程式碼發生在類似的事情exec 3> /tmp/foo
被評估之後,而發生在之後,比如說,exec date
沒有。
答案1
exec
有命令和無命令的意思是無關的。我猜內建名稱已重載,因為一種含義對於命令來說沒有意義,而另一種含義在沒有命令的情況下也沒有意義,因此這樣做就不必發明一個新名稱,而該新名稱將無法用於另一個名稱命令。
這手動的狀態:
如果命令省略但指定了任何重定向,則重定向將在目前 shell 中生效。
這意味著類似的事情exec 3> /tmp/foo
會改變正在運行的 shell 進程中檔案描述符 3 所指向的內容。類似 shell 片段的/bin/somecommand 3>/tmp/foo
意思如下:
- 建立子流程。
- 開啟
/tmp/foo
子進程中的檔案描述子 3 進行寫入。 /bin/somecommand
在子進程中執行該檔案。
exec 3>/tmp/foo
只是執行步驟 3,它不會對進程執行任何操作。
之後exec 3>/tmp/foo
,從 shell 及其子進程對檔案描述符 3 的所有後續存取都會轉到/tmp/foo
,就像任何其他重定向一樣。例如,假設您在沒有任何內容連接到檔案描述符 3 的終端機中執行以下腳本:
echo hello # prints to the terminal
echo nope >&3 # complains about a bad descriptor since no file is open on fd 3
exec >/tmp/out 3>/tmp/three
echo hello # writes to /tmp/out
echo howdy >&3 # writes to /tmp/three
echo wibble >&3 # writes a second line to /tmp/three