shell stdin和stdout重定向输出

时间:2022-03-14 00:02:45

准则 1. 输入

应该允许输入来自以下两种方式:

  • 在命令行上指定的文件名。例如:

     $ command input_file 

    在这个例子中,command 应该读取文件 input_file。

  • 标准输入(stdin),缺省情况下为终端(也就是用户的键盘)。例如:

     $ command 

    这里,用户输入 Control-D(文件结束指示符)前输入的所有内容都成为 command 的输入。

但是,使用 shell 操作符“<”(重定向标准输入),也可将标准输入重定向为来自文件,如下所示:

 

 $ command < input_file 

 

这里,command 会读它的标准输入,不过 shell/内核已将其重定向,所以标准输入来自 input_file。

使用 shell 操作符“|”(pipe)也可以使标准输入来自另一个程序的标准输出,如下所示:

 

 $ other_command | command 

 

这里,other_command 的标准输出(stdout)被 shell/内核透明地传递至 command 的标准输入。

准则 2. 输出

输出应该被写至标准输出,缺省情况下标准输出同样也是终端(也就是用户的屏幕):

 

 $ command 

 

在这个例子中,command 的输出出现在屏幕上。

同样,使用 shell 操作符“>”(重定向标准输出)可以将标准输出重定向至文件。

 

 $ command > output_file 

 

这里,command 仍然写至它的标准输出,不过 shell/内核将其重定向,所以输出写至 output_file。

或者,还是使用“|”操作符,command 的输出可以成为另一个程序的标准输入,如下所示:

 

 $ command | other_command 

 

在这个例子中,shell/内核安排 command 的输出成为 other_command 的输入。

准则 3. 错误输出

错误输出应该被写至标准错误(stderr),缺省情况下标准错误同样也是终端(也就是用户的屏幕):

 

 $ command 

 

这里,运行 command 时出现的任何错误消息都将被写至屏幕。

但是使用标准错误重定向,也可以将错误重定向至文件。例如:

 

 $ command 2>error_file 

 

在这个例子中,command 的正常输出在屏幕显示,而任何错误消息都被写至 error_file。

可以将标准输出和标准错误都重定向至不同的文件,如下所示:

 

 $ command >output_file 2>error_file 

 

这里,将标准输出写至 output_file,而将所有写至标准错误的内容都写至 error_file。

如果已将标准输出重定向至某一位置,也可以将标准错误重定向至同一位置。例如:

 

 $ command 2>&1 

 

在这个例子中,符号“2>&1”表示“将标准错误发送至标准输出被重定向的任何位置”,因此错误和正常的消息都将在屏幕上显示。当然,这是多余的,因为下面简单的调用

 

 $ command 

 

将做同样的事。在标准输出已被重定向至其它源,而您希望在同一命令行上将标准错误也写至同一目的地时,该特性就非常有用。例如:

 

 $ command >output_file 2>&1 

 

在这个例子中,已首先将标准输出重定向至 output_file;因此“2>&1”将使标准错误也被重定向至 output_file。

准则 4. 执行

程序应该有可能既独立运行,也可以作为管道的一部分运行,如上面的示例所示。该特性可以重新叙述如下:不管程序的输入源(文件、管道或终端)和输出目的地是什么,程序都应该以同样的方式工作。这使得在如何使用它方面有最大的灵活性。

准则 5. 命令行参数

如果程序可以根据其输入或用户的首选参数有不同的行为,则应将它编写为接受名为 选项的命令行参数,这些参数允许用户指定什么行为将用于这个调用。

作为选项的命令行参数由前缀“-”(连字符)标识。另一类参数是那些不是选项的参数,也就是说,它们并不真正更改程序的行为,而更象是数据名称。通 常,这类参数代表程序要处理的文件名,但也并非一定如此;参数也可以代表其它东西,如打印目的地或作业标识(有关的示例,请参阅“man cancel”)。

可能代表文件名或其它任何东西的非选项参数(那些没有连字符作为前缀的)如果出现的话,应该在命令的最后出现。

通常,如果指定了文件名参数,则程序把它作为输入。否则程序从标准输入进行读取。

所有选项都应以“-”(连字符)开头。选项可以附加参数。

Linux 实用程序语法图看起来如下:

 

 $ command mandatory_opts [ optional_opts ] [ other_args ] 

 

其中:

  • command 是命令本身的名称。
  • mandatory_opts 是为使命令正常工作必须出现的选项列表。
  • optional_opts 是可指定也可不指定的选项列表,这由用户来选择;但是,其中一些参数可能是互斥的,如同 selpg 的“-f”和“-l”选项的情况(详情见下文)。
  • other_args 是命令要处理的其它参数的列表;这可以是任何东西,而不仅仅是文件名。

在以上定义中,术语“选项列表”是指由空格、跳格或二者的结合所分隔的一系列选项。

以上在方括号中显示的语法部分可以省去(在此情况下,必须将括号也省去)。

各个选项看起来可能与下面相似:

-f (单个选项) 
-s20 (带附加参数的选项) 
-e30 (带附加参数的选项) 
-l66 (带附加参数的选项)

有些实用程序对带参数的选项采取略微不同的格式,其中参数与选项由空格分隔 ― 例如,“-s 20” ― 但我没有选择这么做,因为它会使编码复杂化;这样做的唯一好处是使命令易读一些。

转自:http://hi.baidu.com/ʫչ/blog/item/11b3edf82316d00ed8f9fd37.html

本文出自 “openpy” 博客,请务必保留此出处http://openpy.blog.51cto.com/2798268/1572429