Bash

如果 stdin 被重定向到 fd4,為什麼 read 有效?

  • May 4, 2015

以下腳本是什麼意思?

exec 4<&0 0</etc/XX/cfg
read line1
exec 0<&4

它將 fd0 重定向到 fd4,並將“/etc/XX/cfg”重定向到 fd0。

那麼為什麼read仍然有效,那不應該是空的嗎?

它將標準輸入 (FD0) 重定向到 FD4,從重定向/etc/XX/cfg到 FD0,從 FD0 讀取一行,然後將 FD4 移回 FD0。簡而言之,它保存、替換和恢復標準輸入,同時從文件中讀取一行。

read line1 < /etc/XX/cfg會容易得多,但僅根據顯示的程式碼無法判斷它是否是有效的替代品。

要在系統呼叫中重鑄它(使用 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);

引用自:https://unix.stackexchange.com/questions/36125