我被要求在 C 中重新创建此命令,但没有关于 cmd1 可能是什么的附加信息。
< file1 cmd1 | cmd2 > file2
我的问题围绕该命令的第一个字符解决:<
.
让我们忽略管道后面的命令,并假装 cmd1 是cat
。
因此,我可以替换< file1 cat
为cat file1
,这在 C 中更容易做到。但是当涉及到其他命令时,这种方法是否有效?
我已经用这两个命令测试了cat
和sed
:
< Makefile cat
cat Makefile
和
< Makefile sed 'p'
sed 'p' Makefile
两者打印出相同的结果。那么可以安全地假设我可以解释< file1 cmd1
为吗cmd1 file1
?
答案1
不,你不能。
虽然有许多程序,如大多数常见的文本处理工具(sed
、cut
等grep
),它们从作为命令行参数列出的文件中读取要处理的数据,或者如果没有给出文件则从 stdin 读取数据,但情况并非如此所有程序都有。命令行参数与通过 stdin 提供的数据不同,并且完全取决于程序如何处理它们。
明显的反例是像 这样的程序rm
,它根本不读取标准输入,但即使您认为等价的程序成立,也有类似过滤器的命令,例如tr
和 ,wc
它们根本不接受文件名参数,或者产生不同的输出。
的命令行语法tr
大致为:
tr [options] string1 [string2]
它不接受任何文件名作为参数,但始终读取其标准输入。
因此,转
< file.txt tr abc xyz
进入
tr abc xyz file.txt
只会产生错误。
正如评论中提到的,wc
这是另一种常见的工具,其行为也有所不同,尽管它没有那么极端。给定文件名后,它会将其包含在输出中(即使只有一个,与 with 不同grep
):
$ wc hello.txt
1 1 4 hello.txt
$ wc < hello.txt
1 1 4
此外,许多程序将文件名-
作为读取 stdin 的显式指令,但 shell 不支持这一点。因此,在cat < -
读取名为 的文件时-
,会从 的标准输入(可能是终端)cat -
读取。cat