在脚本中途重定向输出,稍后恢复

Jos*_*osh 2 zsh io-redirection

我想在脚本中途重新定向标准输出。我怎样才能在 Zsh 中做到这一点?

# Do something
# ... 

# Redirect stdout to a file (e.g. foo.txt)
for x in *;
print $x;
done
# Re-direct stdout back to default

# Do something else
# ... 
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 6

使用exec带有重定向但没有命令的内置命令来重定向 shell 的文件描述符。如果要恢复原始目的地,则必须将其保存在另一个描述符中。

exec 3>&1 >foo.txt
for x in *; do
  print $x
done
exec >&3 3>&-
Run Code Online (Sandbox Code Playgroud)

当重定向的范围是代码的一部分时,将重定向放在那段代码周围会更简单。

for x in *; do
  print $x
done >foo.txt
Run Code Online (Sandbox Code Playgroud)

如果要将重定向应用于指令序列,请将其放在大括号内。

{
  for x in *; do
    print $x
  done;
  echo 'one more line'
} >foo.txt
Run Code Online (Sandbox Code Playgroud)

这些构造存在于所有 Bourne/POSIX 风格的 shell 中,而不仅仅是在 zsh 中。

  • 需要注意的是,在 Bourne shell 中,重定向复合命令会导致一个子 shell,因此过去最好在那里使用 `exec 3>&1...`。不再使用现代贝壳。 (2认同)