Hea*_*ray 6 shell bash io-redirection
我有一个 bash 脚本,我想将所有其余的输出重定向到一个文件中。
#!/bin/bash
# the part I don't know ${file}
echo spo
echo car
cat ${file}
Run Code Online (Sandbox Code Playgroud)
输出应该是 spo\ncar\n
如果您重定向脚本其余部分的标准输出,那么这将包括“cat”命令,因此您将看不到它的输出,$file
可能会无限期地填充自身的递归副本(如果它不是那么小,cat
在开始写入之前让我们看看它的结尾)。
从现在开始重定向标准输出,您只需执行以下操作:
exec > "$file"
Run Code Online (Sandbox Code Playgroud)
但在这里也许你想要:
#! /bin/bash -
{
echo spo
echo car
} > "$file"
cat < "$file"
Run Code Online (Sandbox Code Playgroud)
您还可以执行以下操作:
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"
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,上面是现代 shell 在您重定向复合命令时在内部所做的事情{ some; code; } > ...
(尽管它们使用 10 以上的 fd 并在其上设置 O_CLOEXEC 标志,以便执行的命令看不到它),而 Bourne在这种情况下,shell 会派生一个子shell)
还要注意,在上面的代码,你不具备恢复标准输出为脚本的其余部分,可以为做到这一点cat
唯一的命令:
cat < "$file" >&3 3>&-
Run Code Online (Sandbox Code Playgroud)
(3>&-
(关闭 fd 3)不是必需的,因为cat
无论如何都不使用它的 fd 3,但在一般情况下是一种很好的做法,严格来说,我们必须将它添加到每个命令中以模拟 shell 的 O_CLOEXEC 行为)。