如果 stdin 重新導向到 fd4,為什麼 read 可以運作?

如果 stdin 重新導向到 fd4,為什麼 read 可以運作?

下面的腳本是什麼意思?

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/cfgstdin

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

希望這能解釋它。

相關內容