1 理解输入输出
目前为止,你已经知道了两种脚本输出的方法:
在显示器屏幕上显示输出
将输出重定向到文件中
1.1 标准文件描述符
Linux系统将每个对象当作文件处理。这包括输入和输出进程。Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符时一个非负整数,可以唯一标识会话中打开的文 件。每个进程一次最多可以有9个文件描述符。处于特殊目的,bash shell 保留了前三个文件 描述符(0,1和2)。
1 STDIN
STDIN 文件描述符代表shell的标准输入,在终端界面来说,标准输入是键盘。在使用 < 符号 时,Linux会用重定向指定的文件来替换标准输入文件描述符,它会读取文件并提取数据,就 像使用键盘输入的一样。
你可以通过STDIN重定向符号强制cat命令接受来自另一个非标准输入文件的输入
现在cat命令会用ssh_port.sh文件中的行作为输入。
2 STDOUT
STDOUT 文件描述符代表shell的标准输出。在终端界面上,标准输出也就时终端显示器。 shell的所有输出会被定向到标准输出中,也就是显示器。
默认情况下,大部分bash命令会将输出导向STDOUT文件描述符。你也可以通过输出重定向 将命令结果导出到指定文件。
当命令生成错误消息时,shell并未将错误消息通过重定向输出到重定向指定的文件。shell创 建了输出重定向文件,但错误消息却显示在了屏幕上。注意,在显示file文件的时候并没有任 何错误,因为file文件已经创建成功,只是文件内容是空的。
shell对于错误消息的处理是跟普通输出分开的。如果你创建了在后台模式下运行的shell脚 本,通常你必须依赖发送到日志文件的输出消息。用这种方法的话,如果出现了错误信息,这 些信息是不会出现在日志文件中。你需要换种方法来处理。
3 STDERR
shell通过特殊的 STDERR 文件描述符来处理错误消息。STDERR 文件描述符代表shell的标 准错误输出。shell或者shell中运行的程序和脚本出错时生成的错误消息都会发送到这个位 置。
默认情况下,STDERR文件描述符会和STDOUT文件描述符指向同样的地方,尽管分配的描述 符不一样,也就是说,默认情况,错误消息也会显示到显示器输出中。
但从例子也可以看出,STDERR并不会随着STDOUT的重定向而发生改变,使用脚本时,你可 能需要改变这种行为,尤其是当你希望将错误消息保存到日志文件中的时候。
1.2 重定向错误
重定向标准错误输出的方法和STDOUT的方法没太大差别,只需要指定STDERR描述符即可, 有以下几种方法:
1 只重定向错误
2重定向错误和数据
2 在脚本中重定向输出
可以在脚本中用STDOUT和STDERR文件描述符以在多个位置生成输出,只要简单地重定向相 应的文件描述符就可以,有两种方法在脚本中重定向输出
-
临时重定向行输出
-
永久重定向脚本中的所有命令
2.1 临时重定向
如果有意在脚本中生成错误消息,可以将单独的一行输出重定向到STDERR。你所需要坐的是 使用输出重定向符来将输出信息重定向到STDERR文件描述符。在重定向到文件描述符时,你 必须在文件描述符数字之前加一个&。
这样就会在脚本的STDERR文件描述符所指向的位置显示文本,而不是通常的STDOUT,下面 的例子就利用了该功能
运行该脚本,但是结果看不出来有什么区别,默认情况下,Linux会将STDERR导向 STDOUT,但是如果你在运行脚本时重定向了STDERR,脚本中所有导向到SDTERR的文本会 被重定向。
2.2 永久重定向
如果脚本中有大量的数据需要重定向,那重定向每个echo语句就会很麻烦。取而代之,你可以 用exec命令告诉shell在脚本执行期间重定向某个待定文件描述符。
exec 指令会启动一个新shell将STDOUT文件描述符重定向到文件,脚本中发给STDOUT的所 有输出会被重定向到文件。