我想将 echo 的输出与文件内容连接起来。我尝试了以下命令:
echo "abc" | cat 1.txt > 2.txt
但2.txt
文件只包含 的内容1.txt
。为什么不起作用?
答案1
它不起作用,因为cat
管道序列中的程序没有被指示echo
从标准输入读取程序的输出。
您可以将其用作-
伪文件名来指示标准输入cat
。从man cat
msys2 安装中:
EXAMPLES
cat f - g
Output f's contents, then standard input, then g's contents.
因此尝试
echo "abc" | cat - 1.txt > 2.txt
反而。
答案2
正如其他人所指出的,您的原始命令失败,因为cat 1.txt
忽略了其标准输入。要么指出它应该是它的第一个参数(cat - 1.txt
),要么使用阻止重定向重定向echo abc
和 cat 1.txt
一起。即:
{ echo abc; cat 1.txt; } > 2.txt
手册中的相关摘录(man bash
):
复合命令
复合命令是下列命令之一。在大多数情况下,列表命令描述中的“.”可以通过一个或多个换行符与命令的其余部分分隔开,并且后面可以用换行符代替分号。
(
列表)
列表在子 shell 环境中执行(请参阅下面的命令执行环境)。影响 shell 环境的变量赋值和内置命令在命令完成后不再有效。返回状态是 list 的退出状态。
{
列表;
}
列表只是在当前 shell 环境中执行。 列表必须以换行符或分号结尾。这称为群组命令。返回状态是列表。请注意,与元字符
(
和)
,{
和}
是保留字并且必须出现在允许识别保留字的地方。由于它们不会导致单词中断,因此必须将它们与列表 通过空格或其他 shell 元字符。
第一个选项(子 shell 环境)有很多副作用,其中大多数(如果不是全部)都与您的场景无关;但是,如果您只需要重定向一堆命令的输出,那么这里的选项 2(组命令)是首选。
答案3
( echo "abc"; cat 1.txt ) > 2.txt
您将 echo 输出通过管道传输到 cat,但 cat 不需要输入,因此忽略了它。现在命令一个接一个地运行,并且它们的输出被分组(括号)并定向到 2.txt。
答案4
在任何 POSIX shell 中,您都可以使用命令替换cat file
作为以下输入echo
:
echo $(cat file1.txt) "This Too"
在 Bash 中,您可以使用进程替换并将 echo 用作 的另一个“文件” cat
,如下所示:
cat file1.txt <(echo This Too)
然后按照您认为合适的方式通过管道传输或重定向输出。
就像其他所有答案所说的那样,如果 cat 有文件要查看,它会忽略 stdin。(我也喜欢 Daniel 和 mvw 的答案,+1)