Bash
如果 stdin 被重定向到 fd4,為什麼 read 有效?
以下腳本是什麼意思?
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);