这就是我正在努力逐步实现的目标:
- LS
- 然后反转它的输出
- 然后在该文件的最后添加一个新行
因此,我制作了以下一行脚本,但它给出了错误
(ls | tac | echo >>) > ./foobar
我可以通过分成多个命令来完成此操作,但我试图用一个命令来完成此操作。
我很困惑,因为echo >> ./foobar
在文件末尾插入了新行。
那为什么我的这行代码不起作用呢?为什么echo >>
不在文件描述符末尾添加新行而是给出错误?我在这里做错了什么?
答案1
告诉>>
shell 将命令输出附加到紧跟在符号后面的文件名中(因此您至少必须在右括号之前添加一个名称)。
对于您想做的事情,您可以这样做:
ls | tac > ./foobar; echo >>./foobar
或者:
(ls | tac; echo ) >./foobar
两者都取得了相同的结果。
答案2
为了达到指定的结果,可以这样做:
echo -e "`ls | tac`\n" > ./foobar
这样, 的输出ls
就通过管道传输了tac
。结果包含在echo
命令中,转义字符解释echo
将添加新行。然后可以将标准输出重定向到文件。
我不相信可以将 stdout 通过管道传输到 echo 中。
答案3
以下是您的命令的解析方式:
(…)
是一个复合命令。括号中的内容在子 shell 中执行。ls | tac | echo >>
是一个由三部分组成的管道:ls
、tac
和echo >>
。最左边部分的输出连接到第二部分的输入,第二部分的输出连接到最右边部分的输入。ls
是一个简单的命令,执行一个可执行文件。tac
是一个简单的命令,执行一个可执行文件。echo >>
语法上不正确。运算>>
符后面需要跟文件名,文件名缺失。
> ./foobar
将复合命令的输出重定向到文件./foobar
。
将输入定向到echo
没有意义:它不读取任何输入。要用于echo
附加到其他命令的输出,请运行echo
后另一个命令,不是并行的。
ls | tac; echo
的输出echo
将转到与 的输出相同的位置tac
,因此不需要任何重定向。
( ls | tac; echo ) >./foobar
这里不需要子外壳。简单的分组就可以了。 (看Bash 中的简单逻辑运算符有关 bash 括号式运算符的摘要。)
{ ls | tac; echo; } >./foobar
使用>>
运算符来附加仅当您附加到已存在的文件时才需要。这里的情况并非如此:所有命令都转到同一位置,文件foobar
仅打开一次,并且只要整个复合命令正在执行,文件就保持打开状态。>>
如果您打开文件两次,则需要该运算符:
ls | tac >./foobar; echo >>./foobar