如果 stdin 被重定向到 fd4,为什么 read 有效?

dai*_*isy 4 shell scripting bash io-redirection

下面的脚本是什么意思?

exec 4<&0 0</etc/XX/cfg
read line1
exec 0<&4
Run Code Online (Sandbox Code Playgroud)

它将 fd0 重定向到 fd4,并将“/etc/XX/cfg”重定向到 fd0。

那么为什么read仍然有效,那不应该是空的吗?

Ign*_*ams 5

它将 stdin (FD0) 重定向到 FD4,从重定向/etc/XX/cfg到 FD0,从 FD0 读取一行,然后将 FD4 移回 FD0。简而言之,它保存、替换和恢复标准输入,同时从中间的文件中读取一行。

read line1 < /etc/XX/cfg 会容易得多,但无法仅根据显示的代码判断它是否是有效的替代品。

  • 它不会将 fd0“重定向”到 fd4,而是“复制”它(使用 `dup2` 系统调用),因此从任一描述符读取将具有相同的效果。当然,它随后会覆盖 fd0,因此您可以将其视为“移动”描述符,如果您愿意的话。 (4认同)