我有一个 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 行为)。