我可以将 `< file1 cmd1` 解释为 `cmd1 file1` 吗?

我可以将 `< file1 cmd1` 解释为 `cmd1 file1` 吗?

我被要求在 C 中重新创建此命令,但没有关于 cmd1 可能是什么的附加信息。

< file1 cmd1 | cmd2 > file2

我的问题围绕该命令的第一个字符解决:<.

让我们忽略管道后​​面的命令,并假装 cmd1 是cat

因此,我可以替换< file1 catcat file1,这在 C 中更容易做到。但是当涉及到其他命令时,这种方法是否有效?

我已经用这两个命令测试了catsed

< Makefile cat
cat Makefile

< Makefile sed 'p'
sed 'p' Makefile

两者打印出相同的结果。那么可以安全地假设我可以解释< file1 cmd1为吗cmd1 file1

答案1

不,你不能。

虽然有许多程序,如大多数常见的文本处理工具(sedcutgrep),它们从作为命令行参数列出的文件中读取要处理的数据,或者如果没有给出文件则从 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

相关内容