为什么有些命令不接受输入重定向?

ang*_*net 7 bash bash-scripting fedora-20

例如,回声

[aesteban@localhost ~]$ cat tmp.txt 
Angel
[aesteban@localhost ~]$ echo < tmp.txt

[aesteban@localhost ~]$
Run Code Online (Sandbox Code Playgroud)

如您所见,输出只是一个空行。根据我的阅读,一些命令能够进行输入重定向,例如mail

[aesteban@localhost ~]$ mail barney@example.com < tmp.txt 
Run Code Online (Sandbox Code Playgroud)

那么输入重定向仅适用于交互式命令(能够等待输入的命令)吗?如何确定命令是否是交互式的(除了尝试之外)?

Edw*_*ard 5

为什么有些命令不接受输入重定向?

简短的回答:因为它们没有被编程。

对于要读取的程序stdin(这是 shell 连接到后面指定的文件的流<)不是自动的。它需要由程序员编码。就此而言,从命令行上给出的文件读取也不是自动的。也就是说,这些文件的内容,无论是通过重定向给出还是通过名称指定,都不会在没有额外编码的情况下神奇地出现在程序的变量中。

如果程序从未被编码为从流中读取,那么您是否进行重定向并不重要 - 它根本不会从流中读取。根据其 POSIX 规范(http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html),echo不需要读取stdin,并且仅检查其命令行参数(和一些环境变量)。要了解其他程序,您可以阅读源代码、文档,或者只是按照您所说的进行尝试:-)

回答你的最后一个问题:你不能真正说命令是交互式的。您可以确定其读取的输入流是否连接到终端(而不是例如普通文件)。http://rosettacode.org/wiki/Check_input_device_is_a_terminal上有多种语言的示例。您可以设想一个邮件程序,使用此功能来确定它是否以交互方式使用(接受键盘命令来读取邮件),或以非交互方式使用(例如,从文件中读取邮件消息)。我不知道是怎么mail回事。(请注意,mail使用或不使用命令行参数调用时,行为会有所不同!)