猫命令和回声

Rin*_*r81 15 linux cat concatenation echo

我想将 echo 的输出与文件内容连接起来。我试过以下命令:

echo "abc" | cat 1.txt > 2.txt
Run Code Online (Sandbox Code Playgroud)

但该2.txt文件仅包含来自1.txt. 为什么不起作用?

mvw*_*mvw 26

它不起作用,因为cat没有指示管道序列中的echo程序从标准输入读取程序的输出。

您可以将其-用作伪文件名来指示对cat. 从man catmsys2 安装:

EXAMPLES
       cat f - g
              Output f's contents, then standard input, then g's contents.
Run Code Online (Sandbox Code Playgroud)

所以试试

echo "abc" | cat - 1.txt > 2.txt
Run Code Online (Sandbox Code Playgroud)

反而。


Nub*_*rke 22

正如其他人所指出的,您的原始命令失败是因为cat 1.txt忽略了其标准输入。要么指示它应该是它的第一个参数 ( cat - 1.txt),要么使用块重定向来重定向echo abc cat 1.txt一起。以机智:

{ echo abc; cat 1.txt; } > 2.txt 
Run Code Online (Sandbox Code Playgroud)

手册相关摘录(man bash):

复合命令
复合命令是以下命令之一。在大多数情况下,命令描述中的列表可以通过一个或多个换行符与命令的其余部分分开,并且后面可以跟一个换行符代替分号。

(列表)

    list在子 shell 环境中执行(请参阅下面的命令执行环境)。影响 shell 环境的变量赋值和内置命令在命令完成后不再有效。返回状态是列表的退出状态。

{? 列表; }

    list只是在当前 shell 环境中执行。  列表必须以换行符或分号结束。这称为组命令。返回状态是list的退出状态。请注意,与元字符(和不同的是){}保留字,并且必须出现在允许识别保留字的地方。由于它们不会导致断字,因此它们必须 通过空格或其他 shell 元字符与列表分开。

第一个选项(子shell 环境)有很多副作用,大多数(如果不是全部)都与您的场景无关;但是,如果您只需要重定向一堆命令的输出,那么这里的选项 #2(组命令)是首选。


Ger*_*lle 8

( echo "abc"; cat 1.txt ) > 2.txt
Run Code Online (Sandbox Code Playgroud)

您将 echo 输出通过管道传递给 cat,但 cat 没有用于输入,因此忽略了它。现在命令一个接一个地运行,它们的输出被分组(括号)并定向到 2.txt。

  • 这里没有明确要求子shell,也许使用组命令会更好。有关更多详细信息,请参阅我的答案。 (6认同)

Xen*_*050 3

在任何 POSIX shell 中,您可以使用命令替换作为cat file输入echo

echo $(cat file1.txt) "This Too"
Run Code Online (Sandbox Code Playgroud)

在 Bash 中,您可以使用进程替换并使用 echo 作为 的另一个“文件” cat,如下所示:

cat file1.txt <(echo This Too)
Run Code Online (Sandbox Code Playgroud)

然后根据需要通过管道或重定向输出。

就像其他所有答案所说的那样,如果 cat 有要查看的文件,它将忽略 stdin。(我也喜欢 Daniel 和 mvw 的答案,为他们+1)

  • 这个答案可以通过解释为什么OP最初的尝试不起作用(以及为什么这是必要的)来改进。 (2认同)