将所有标准重定向到脚本的其余部分

将所有标准重定向到脚本的其余部分

我有一个 bash 脚本,我想将所有其余输出重定向到一个文件中。

#!/bin/bash
# the part I don't know  ${file}
echo spo 
echo car

cat ${file}

输出应该是 spo\ncar\n

答案1

如果您为脚本的其余部分重定向标准输出,那么这将包括“cat”命令,因此您不会看到它的输出,$file可能会无限期地填充其自身的递归副本(并且如果它不是那么小的话也会)cat在开始写之前先看看它的结尾)。

要从现在开始重定向标准输出,您只需执行以下操作:

exec > "$file"

但在这里也许你想要:

#! /bin/bash -
{
  echo spo 
  echo car
} > "$file"

cat < "$file"

您还可以执行以下操作:

exec 3>&1 # save stdout as fd 3
exec > "$file"
echo spo
echo car
exec >&3 3>&- # restore stdout and close fd 3
cat < "$file"

(顺便说一句,上面是现代 shell 在重定向复合命令时在内部执行的操作{ some; code; } > ...(尽管它们使用大于 10 的 fd 并在其上设置 O_CLOEXEC 标志,以便执行的命令看不到它),而 Bourne在这种情况下 shell 会分叉一个子 shell)

另请注意,在上面的代码中,您没有要恢复脚本其余部分的标准输出,您可以cat仅对命令执行此操作:

cat < "$file" >&3 3>&-

3>&-(close fd 3) 不是必需的,因为cat无论如何都不使用它的 fd 3,但在一般情况下是很好的做法,严格来说,我们必须将它添加到每个命令中以模拟 shell 的 O_CLOEXEC 行为)。

相关内容