为什么某些命令不采用输入重定向?


4

例如,echo

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

[aesteban@localhost ~]$

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

[aesteban@localhost ~]$ mail barney@example.com < tmp.txt 

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

Answers:


3

为什么某些命令不采用输入重定向?

简短的答案:因为它们不是经过编程的。

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

如果程序从未被编码为从流中读取,则是否放置重定向都无关紧要-它不会直接从其中读取。根据其POSIX规范(http://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html),echo不需要从中读取stdin,而仅检查其命令行参数(和某些环境变量)。要查找其他程序,您可以阅读源代码,文档,也可以按照您说的简单尝试一下:-)

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


1

如果在命令行上未指定文件,则大多数读取在命令行上指定了名称的文件内容的命令将从标准输入中读取。如果- 在命令行上指定文件名,则某些文件也会从标准输入中读取;例如,

文件1  -  文件2

将从中读取,然后是标准输入,然后是。但是,如果命令通常不读取在命令行上指定了名称的文件的内容,那么它也可能不会对标准输入执行任何操作。  从不读取文件。file1file2echo

当然,有多种例外情况:

  • tr命令始终从标准输入读取,并且不接受命令行上的文件名。
  • 如果bc用文件名参数调用if ,它将读取它们, 然后还读取标准输入,除非其中一个文件具有haltor quit命令。
  • 编译器(例如C编译器,可以称为ccgcc)倾向于在命令行上需要(或至少强烈希望使用)文件名。  cc如果在命令行中不使用任何文件名调用将失败。  cc -仅在指定了某些选项的情况下,才会读取标准输入。
  • 调用cmpdiff 使用少于两个输入源是没有意义的。如果在命令行中不使用任何文件名调用它们,它们将失败。两者都遵循一个约定,即参数-指定标准输入。  等价于; 即,它将与标准输入进行比较。  如果使用一个文件名参数调用失败;您需要说。cmp file1cmp file1 -file1diffdiff file1 -
  • 而且,虽然dd会接受 NPUT ˚F如果呈现在命令行上指定ILE ,例如,if=filename

    dd if=my_iso_file of=/dev/sda1

    ofØ本安输出˚F ILE),它会从标准输入读取,如果你不指定任何if; 例如,

    dd of=/dev/sda1 < my_iso_file

    它不接受命令行参数缦文件名 (因此,例如,dd my_iso_file > /dev/sda1dd my_iso_file of=/dev/sda1工作)。(此外,与大多数从文件中读取的命令不同, dd它将不会从命令行处理多个输入文件。)

(可能还有其他人。)


从技术上讲,您可以将文件重定向到dddd status=none < /proc/uptime
史蒂文

0

阅读文档。

echo命令不从stdin读取。因此,输入重定向不执行任何操作。重击手册状态:

echo:输出args,以空格分隔,后跟换行符。

手册页cat

cat-连接文件并在标准输出上打印。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.