Cat 命令和回显

Cat 命令和回显

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

echo "abc" | cat 1.txt > 2.txt

2.txt文件只包含 的内容1.txt。为什么不起作用?

答案1

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

您可以将其用作-伪文件名来指示标准输入cat。从man catmsys2 安装中:

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)

相关内容