我想使用 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