删除重定向运算符不会更改输出。为什么?

mus*_*usa 3 command-line shell bash io io-redirection

我在某处看到了这种重定向的用法,并认为这是一个错字:

grep root < /etc/passwd
Run Code Online (Sandbox Code Playgroud)

但是在我运行它之后,我看到它给出了与以下相同的输出 grep root /etc/passwd

$ grep root < /etc/passwd
root:x:0:0:root:/root:/bin/bash

$ grep root   /etc/passwd
root:x:0:0:root:/root:/bin/bash
Run Code Online (Sandbox Code Playgroud)

同样的事情发生在

cat < /etc/passwd
cat   /etc/passwd
Run Code Online (Sandbox Code Playgroud)

但是,与 一起使用时,重定向将被忽略ls

ls < /etc/passwd
Run Code Online (Sandbox Code Playgroud)

不打印相同的输出

ls  /etc/passwd
Run Code Online (Sandbox Code Playgroud)

怎么了?

Pet*_*r.O 8

许多处理文件的实用程序将接受stdin(标准输入)作为流输入,或接受文件名作为参数。您的< file示例将文件的输出重定向到实用程序。该文件由 shell 打开并通过stdin传递给您的实用程序。

另一方面, with cat filecat正在处理文件的打开和读取,并且不涉及重定向。

ls从不读取文件,因此它不会将文件名作为参数以打开和读取文件..(它接受文件名掩码)......对于ls,重定向操作实际上被忽略,因为进程中没有任何内容读取外壳打开的文件...

要确定任何实用程序的行为方式,只需man utility-name在终端中输入... man手动的缩写...例如。man cat为您提供猫的手册

  • 我一直认为 `wc` 是一个有用的演示程序,因为它的行为与文件重定向略有不同:在前一种情况下,文件名被打印出来。通过重定向,您可以捕获子shell 中的输出并将其用作整数。 (4认同)