使用 cat 命令从标准输入读取数据并将其写入文件,这不是一个无用的 cat 命令使用吗?

5

我想写一个shell脚本,接受标准输入的数据,将其写入文件,然后对其执行某些操作。

针对这个问题,假设我的脚本应该接受标准输入,将其写入in.txt,然后从中grep一个字符串"foo"并将输出写入out.txt

我写了这个脚本。

cat > in.txt
grep foo in.txt > out.txt

如下面的一些答案所解释的那样,我们可以直接使用

tee in.txt | grep foo > out.txt

如果是其他命令而不是grep,不能从标准输入读取吗?这时候使用cat就变成有效的了吗?
以下是一个使用chmod的例子。
cat > in.txt
chmod -v 600 in.txt > out.txt

在脚本结束后,输入和输出都必须以文件形式提供是一个要求。

我想知道我的代码是否在无用地使用了cat,或者这种情况下调用cat是否完全有效?

另外,是否有一种方法可以重写此代码,而不使用cat,以便它不会无用地使用任何命令?

注意:我关心的答案适用于任何符合POSIX标准的shell,而不仅仅是Bash或Linux。


在你的例子中,为什么不使用grep foo <in.txt >out.txt && nextcmd out.txt这种方式呢?(利用复合命令)(注意:初始重定向是可选的) - David C. Rankin
很少有命令不从stdin读取。偶尔需要指定“-”来表示输入在stdin中。非常非常偶尔需要拼写出:/dev/stdin。 - rici
@rici 命令,如 chmodchown 等,无法在标准输入上工作。在创建文件后更改其所有权或权限是一个有效的情况需要考虑。此外,/dev/stdin 在 POSIX 中未定义。 - Lone Learner
2
如果你需要创建一个文件,尽管使用cat命令。这就是它存在的意义。但是,如果你使用它来告诉其他实用程序要处理哪个文件,那就是“uuoc”了。而且,tee命令也无法帮助你进行chmod操作 :-) - rici
@DavidC.Rankin,我仍然不明白你的第一条评论与这个讨论有什么关系。如何在不使用“cat”的情况下从标准输入接受数据并将其写入文件?“grep in.txt”命令正在“处理它”。你也可以使用chmod而不是grep,在这种情况下,chmod 600 in.txt也会“处理它”。 - Lone Learner
显示剩余3条评论
2个回答

5

使用cat是合法的,但是你需要使用tee命令。它被设计用于将所有内容写入文件和标准输出流。

tee in.txt | grep foo > out.txt

然而,在一般情况下,如果 some_command 可能不从标准输入读取文本,我仍然需要使用 cat > in.txt; some_command in.txt > out.txt,对吗?还是我应该选择 tee in.txt > /dev/null; some_command in.txt > out.txt - Lone Learner
tee in.txt > /dev/nullcat > in.txt 更糟糕。 - user513951
2
@LoneLearner - 对的。如果程序读取stdin,那么tee是很好的选择。如果它需要一个文件,那么cat > in.txt就是正确的方法。只要文件不是巨大的,它将会在操作系统的磁盘缓存中,因此速度会很快。 - tdelaney

-1
“cat”的目的是连接(或“串联”)文件。如果只有一个文件,则将其与空白连接起来是浪费时间并且会消耗进程。所以,是的,它实际上是无用的。我认为“tee”解决方案是最符合POSIX标准的方法,但如果两个进程的成本太高,您可以使用特定于shell的结构。

如果是其他命令而不是grep,它不从标准输入读取怎么办?这样使用cat就变成有效的了吗?我现在已经将这个问题添加到我的问题中了。 - Lone Learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接