Subsections

5 输入和输出的控制

在您使用 Linux 的整个过程中,您很可能发现控制程序的输入和输入的效果是显著的。这一节叙述控制输入和输入将能为您带来些什么。


1 标准输入标准输出、管道和重定向

每个进程和外部世界至少有三个连接。标准输入 (standard input) 是进程的一个数据来源;标准输出 (standard output) 是其输出数据的一个地方;标准错误 (standard error) 设备是进程可以输出错误讯息的一个地方(它们通常简写为 stdinstdoutstderr。)

单词“源”和“地方”是故意含糊其词的。这些标准输出和输出定位可以被用户修改;它们可以是屏幕、键盘、一个文件,甚至一个网络连接。您可以定向它加以使用。

当您在 shell 下运行一个程序时,通常键盘是标准输入,标准输出和错误显示都是显示屏。然而您可以让 shell 改变这些缺省设置。

举个例子,echo 这个命令把它的输入送到标准输出,通常是屏幕。但是您可以把它送给一个文件──通过使用输出重定向操作符>。比如,把单词 ``Hello'' 放到 myfile 文件中,可以使用如下命令:

echo Hello > myfile

使用 cat 或您的文本文件定页阅读器 (moreless) 来看 myfile 的文件内容;请看图 6.3,在 [*] 页。

图 6.3: 重定向输出
\begin{figure}\par\par\begin{list}{}{\setlength{\rightmargin}{\leftmargin}\ragge...
...\par\$~\textbf{cat~myfile}
\par Hello
\par\$\end{ttfamily}\end{list}\end{figure}

您可以用输入重定向操作符 < 来改变一个命令的标准输入,例如,cat < myfile 将显示 myfile 的内容。在实际应用中这是没有什么意义的;出于方便,cat 命令接受一个文件名参数。所以您只要键入 cat myfile,效果是相同的。

此时 cat < myfile 的意思是 shell 打开文件 myfile,然后把它的内容送到 cat 的标准输入。cat myfile,即在没有重定操作符时,意思是 cat 这个命令接受一个参数 (myfile),自己打开这个文件,然后显示这个文件的内容。

存在这样的两种方法是有道理的。比如,您可以把一个命令的标准输出连到另一个命令的标准输入。这叫做管道,使用管道操作符[*]|.

也许您想倒着看 GNU 的通用公共许可证。为了做到这一点,您会使用 tac 命令,(它就是 cat,只不过是倒着的)。请试一下:

tac /usr/share/common-licenses/GPL

不幸地是,它闪得太快而很不见。所以您只能看到一些章节。解决方法是使用管道(pipeline):

tac /usr/share/common-licenses/GPL | less

这将取 tac 的标准输出,倒转了的 GPL,再送到 less 的标准输入。

您可以把许多命令链接在一起。假如您有一个莫名的欲望想用 Q 替换所有的 G。为此您要使用命令 tr G Q,如:

tac /usr/share/common-licenses/GPL | tr G Q | less 

您也可以使用临时文件和重定向来获得相同的效果,比如:

tac /usr/share/common-licenses/GPL > tmpfile

tr G Q < tmpfile > tmpfile2

less < tmpfile2

rm tmpfile tmpfile2 

很明显使用管道方便多了。

John Goerzen / Ossama Othman / Debian 中文计划