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(组命令)是首选。
( echo "abc"; cat 1.txt ) > 2.txt
Run Code Online (Sandbox Code Playgroud)
您将 echo 输出通过管道传递给 cat,但 cat 没有用于输入,因此忽略了它。现在命令一个接一个地运行,它们的输出被分组(括号)并定向到 2.txt。
在任何 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)
| 归档时间: |
|
| 查看次数: |
27587 次 |
| 最近记录: |