将所有命令的输出重定向到文件,而不仅仅是最后一个

将所有命令的输出重定向到文件,而不仅仅是最后一个

我想使用 echo 添加标头到文件,然后使用命令创建文件的其余部分。这意味着我将使用两个单独的命令。

如何通过重定向将两个命令的输出写入文件?

我试过了

echo "header line" | cut -c 1-5 input_file > output_file

echo "header line"; cut -c 1-5 input_file > output_file

这仅重定向 cut 命令的输出。

以下命令有效,但感觉很笨拙:

echo "header line" > output_file; cut -c 1-5 input_file >> output_file

解决我的问题的聪明方法是什么?

答案1

您寻找的是:

{ echo "header line"; cut -c 1-5 input_file; } > output_file
  • 此语法没有副作用,因为命令是在当前 shell 中执行,而不是在子 shell 中执行
  • 进入输出文件的命令有明确的界限
  • 它的扩展性很好,你可以这样重写它:

{
  echo "header line"
  cut -c 1-5 input_file
  ... # insert new commands here
} > output_file

如果您希望错误输出到同一文件,您可以这样修改最后一行:

} > output_file 2>&1

感谢奥利维尔·杜拉克(Olivier Dulac)提醒这一提示。

如果您希望块内的某些输出显示到屏幕上,您可以使用该语法:

{
  echo "header line"
  echo "this line doesn't go to output_file" > /dev/tty
  cut -c 1-5 input_file
} > output_file

答案2

这里的问题不是 Linux 重定向的问题;而是 Linux 重定向的问题。相反,这是对管道工作原理的根本误解。此处的重定向不起作用,因为仅有的cut 实际上是打印到标准输出。 echo 命令的标准输出已通过管道传输到 cut 的标准输入(由于指定了文件,因此在本例中未使用该标准输入)。

echo "header line" > output_file && cut -c 1-5 input_file >> output_file

就是你想要的,而且一点也不雅致(我用你的替换了你的,;以便&&只有在标头成功写入时,cut命令才会执行;这样,如果你没有创建或写入output_file的权限,它就不会执行)。

您也可以在子 shell 中完成这一切,例如。

(echo "header line"; cut -c 1-5 input_file) > output_file

但这样做并没有真正的好处,并且对于更复杂的示例,如果您不熟悉子 shell 的作用域,则可能会导致问题。

如果您想将 stdin 传递到 stdout,您可以尝试:

echo "header line" | cut -c 1-5 - input_file

(破折号是标准输入的常见快捷方式)

但是,这也会对 stdin 执行剪切操作(导致标题行为“header”)。从问题中很难判断这是否是你想要的。

答案3

只是为了完善答案,有 exec。

exec > output_file
echo "header line"
cut -c 1-5 input_file

相关内容