回声>>不工作

回声>>不工作

这就是我正在努力逐步实现的目标:

  1. LS
  2. 然后反转它的输出
  3. 然后在该文件的最后添加一个新行

因此,我制作了以下一行脚本,但它给出了错误

(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 >>是一个由三部分组成的管道:lstacecho >>。最左边部分的输出连接到第二部分的输入,第二部分的输出连接到最右边部分的输入。
    • 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

相关内容