The*_*Cat 11 shell io-redirection
我想用回显向文件添加标题,然后使用命令创建文件的其余部分。这意味着我将使用两个单独的命令。
如何将两个命令的输出写入带有重定向的文件?
我试过了
echo "header line" | cut -c 1-5 input_file > output_file
echo "header line"; cut -c 1-5 input_file > output_file
Run Code Online (Sandbox Code Playgroud)
这只会重定向 cut 命令的输出。
以下命令有效,但感觉很笨拙:
echo "header line" > output_file; cut -c 1-5 input_file >> output_file
Run Code Online (Sandbox Code Playgroud)
解决我的问题的聪明方法是什么?
jll*_*gre 13
你要找的是:
{ echo "header line"; cut -c 1-5 input_file; } > output_file
Run Code Online (Sandbox Code Playgroud)
{
echo "header line"
cut -c 1-5 input_file
... # insert new commands here
} > output_file
Run Code Online (Sandbox Code Playgroud)
如果您希望错误输出转到同一个文件,您可以这样修改最后一行:
} > output_file 2>&1
Run Code Online (Sandbox Code Playgroud)
感谢 Olivier Dulac 提醒该提示。
如果您希望块内的某些输出进入您的屏幕,您可以使用该语法:
{
echo "header line"
echo "this line doesn't go to output_file" > /dev/tty
cut -c 1-5 input_file
} > output_file
Run Code Online (Sandbox Code Playgroud)
Sam*_*ted 11
这里的问题不是 Linux 重定向的问题;相反,这是对管道如何工作的根本误解。这里的重定向不起作用,因为只有cut 实际上打印到标准输出。echo 命令的标准输出已通过管道传输到 cut 的标准输入(由于指定了文件,因此在本例中未使用)。
echo "header line" > output_file && cut -c 1-5 input_file >> output_file
Run Code Online (Sandbox Code Playgroud)
是你想要的,一点也不不优雅(我用你替换了你;
,&&
这样 cut 命令只会在头成功写入时执行;这样,如果你没有创建或写入 output_file 的权限,它就不会执行)。
您也可以在子shell中完成所有操作,例如。
(echo "header line"; cut -c 1-5 input_file) > output_file
Run Code Online (Sandbox Code Playgroud)
但是这样做并没有真正的好处,而且如果您不熟悉子外壳的作用域范围,那么对于更复杂的示例,它可能会导致问题。
如果您想 cut 将 stdin 传递到 stdout,您可以尝试:
echo "header line" | cut -c 1-5 - input_file
Run Code Online (Sandbox Code Playgroud)
(破折号是标准输入的常用快捷方式)
但是,这也会对 stdin 执行剪切操作(导致标题行为“header”)。很难从问题中判断这是否是您想要的。
只是为了完善答案,有 exec。
exec > output_file
echo "header line"
cut -c 1-5 input_file
Run Code Online (Sandbox Code Playgroud)