Linux Shell脚本编程初体验

2019-09-23 09:24:54于海丽


root@localhost ~]# who am i <--- 你通过标准输入对 bash shell 说
root pts/0 2015-04-22 20:17 (192.168.1.123) <--- bash shell通过标准输出回答你

现在,让我们说一些bash听不懂的问题:

[root@localhost ~]# blablabla <--- 哈,你又在和标准输入说话了
-bash: blablabla: command not found <--- bash通过标准错误在发牢骚了

“:”之前的第一个单词通常是向你发牢骚的命令。实际上,这些流中的每一个都有它们自己的索引号(LCTT 译注:文件句柄号):


●标准输入(stdin) - 0
●标准输出(stdout) - 1
●标准错误(stderr) - 2


如果你真的想要知道哪个输出命令说了些什么——你需要将那次发言重定向到(在命令后使用大于号“>”和流索引)文件:

[root@localhost ~]# blablabla 1> output.txt
-bash: blablabla: command not found

在本例中,我们试着重定向流1(stdout)到名为output.txt的文件。让我们来看对该文件内容所做的事情吧,使用cat命令可以做这事:

[root@localhost ~]# cat output.txt
[root@localhost ~]#

看起来似乎是空的。好吧,现在让我们来重定向流2(stderr):

[root@localhost ~]# blablabla 2> error.txt
[root@localhost ~]#

好吧,我们看到牢骚话没了。让我们检查一下那个文件:

[root@localhost ~]# cat error.txt
-bash: blablabla: command not found
[root@localhost ~]#

果然如此!我们看到,所有牢骚话都被记录到errors.txt文件里头去了。


有时候,命令会同时产生stdout和stderr。要重定向它们到不同的文件,我们可以使用以下语句:

command 1>out.txt 2>err.txt

要缩短一点语句,我们可以忽略“1”,因为默认情况下stdout会被重定向:
command >out.txt 2>err.txt好吧,让我们试试做些“坏事”。让我们用rm命令把file1和folder1给删了吧:

[root@localhost ~]# rm -vf folder1 file1 > out.txt 2>err.txt

现在来检查以下输出文件:

[root@localhost ~]# cat out.txt
removed `file1'
[root@localhost ~]# cat err.txt
rm: cannot remove `folder1': Is a directory
[root@localhost ~]#

正如我们所看到的,不同的流被分离到了不同的文件。有时候,这也不是很方便,因为我们想要查看出现错误时,在某些操作前面或后面所连续发生的事情。要实现这一目的,我们可以重定向两个流到同一个文件:

command >>out_err.txt 2>>out_err.txt

注意:请注意,我使用“>>”替代了“>”。它允许我们附加到文件,而不是覆盖文件。