下面的腳本是什麼意思?
exec 4<&0 0</etc/XX/cfg
read line1
exec 0<&4
它將 fd0 重新導向到 fd4,並將“/etc/XX/cfg”重新導向到 fd0。
那麼為什麼read
仍然有效,它不應該是空的嗎?
答案1
它將 stdin (FD0) 重定向到 FD4,從 FD0 重定向/etc/XX/cfg
到 FD0,從 FD0 讀取一行,然後將 FD4 移回 FD0。簡而言之,它保存、替換和恢復標準輸入,同時從中間的檔案中讀取一行。
read line1 < /etc/XX/cfg
會容易得多,但僅根據顯示的程式碼無法判斷它是否是有效的替換。
答案2
要在系統呼叫中重鑄它(使用 C):
exec 4<&0 0</etc/XX/cfg
/* Duplicate fd0 as fd4. */
dup2 (0, 4);
/* Open file on fd0.
"open" always uses lowest available descriptor, so we don't need to check it. */
close (0);
open ("/etc/XX/cfg", O_RDONLY);
exec 0<&4
/* Close fd0 and duplicate fd4 as fd0. */
dup2 (4, 0);
答案3
我閱讀此內容的方式 - 基於 bash 手冊頁上的 REDIRECTION 部分 - 是將 (fd0) 重定向到 fd4,然後從intostdin
獲取輸入- 最終將到達 fd4。/etc/XX/cfg
stdin
read line1
然後應該從 fd4 中取出,然後放回 fd0。
演示可能會更好地展示我的意思,並回答“為什麼”你可能會這樣做。透過添加另一行並將其放入包裝器中:
$ vim ./test.sh
#!/bin/bash
exec 4<&0 0</etc/XX/cfg
read line1 # reads from fd4
exec 0<&4
read line2 # reads from fd0
echo $line1
echo $line2
您可以透過 test.sh 進行管道或重定向stdin
,但也可以透過重定向讀取配置,因此在上面的程式碼中,我從「config」中提取了值(我根據文件名進行假設- 不好:) ),但我也可以透過 stdin 進行處理。
例如:
$ ./test.sh < somefile
$ cat somefile | ./test.sh
希望這能解釋它。