Linux系统将每个对象当作文件处理,这包括输入和输出进程。Linux用文件描述符(file descriptor)来标识每个文件对象。文件描述符是一个非负整数,可以唯一标识会话中打开的文件。每个进程一次多可以有九个文件描述符。出于特殊目的,bash shell保留了前三个文件描述符(0、1和2),详情见下表。
Linux的标准文件描述符
这三个特殊文件描述符会处理脚本的输入和输出。shell用它们将shell默认的输入和输出导向到相应的位置。下面南昌网络公司-百恒网络就来为大家介绍一下这些标准文件描述符,供大家参考!
一、STDIN
STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。shell从STDIN 文件描述符对应的键盘获得输入,在用户输入时处理每个字符。
在使用输入重定向符号(<)时,Linux会用重定向指定的文件来替换标准输入文件描述符。 它会读取文件并提取数据,就如同它是键盘上键入的。
许多bash命令能接受STDIN的输入,尤其是没有在命令行上指定文件的话。下面是个用cat 命令处理STDIN输入的数据的例子。
$ cat
this is a test
this is a test
this is a second test.
this is a second test.
当在命令行上只输入cat命令时,它会从STDIN接受输入。输入一行,cat命令就会显示出 一行。
但你也可以通过STDIN重定向符号强制cat命令接受来自另一个非STDIN文件的输入。
$ cat < testfile
This is the first line.
This is the second line.
This is the third line.
$
现在cat命令会用testfile文件中的行作为输入。你可以使用这种技术将数据输入到任何能从 STDIN接受数据的shell命令中。
二、STDOUT
STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。shell 的所有输出(包括shell中运行的程序和脚本)会被定向到标准输出中,也就是显示器。
默认情况下,大多数bash命令会将输出导向STDOUT文件描述符。同时,你也可以用输出重定向来改变。
$ ls -l > test2
$ cat test2
total 20
-rw-rw-r-- 1 rich rich 53 2014-10-16 11:30 test
-rw-rw-r-- 1 rich rich 0 2014-10-16 11:32 test2
-rw-rw-r-- 1 rich rich 73 2014-10-16 11:23 testfile
$
通过输出重定向符号,通常会显示到显示器的所有输出会被shell重定向到指定的重定向文件。你也可以将数据追加到某个文件。这可以用>>符号来完成。
$ who >> test2
$ cat test2
total 20
-rw-rw-r-- 1 rich rich 53 2014-10-16 11:30 test
-rw-rw-r-- 1 rich rich 0 2014-10-16 11:32 test2
-rw-rw-r-- 1 rich rich 73 2014-10-16 11:23 testfile
rich pts/0 2014-10-17 15:34 (192.168.1.2)
$
who命令生成的输出会被追加到test2文件中已有数据的后面。 但是,如果你对脚本使用了标准输出重定向,你会遇到一个问题。下面的例子说明了可能会出现什么情况。
$ ls -al badfile > test3
ls: cannot access badfile: No such file or directory
$ cat test3
$
当命令生成错误消息时,shell并未将错误消息重定向到输出重定向文件。shell创建了输出重 定向文件,但错误消息却显示在了显示器屏幕上。注意,在显示test3文件的内容时并没有任何错误。test3文件创建成功了,只是里面是空的。
shell对于错误消息的处理是跟普通输出分开的。如果你创建了在后台模式下运行的shell脚本,通常你必须依赖发送到日志文件的输出消息。用这种方法的话,如果出现了错误信息,这些信息是不会出现在日志文件中的。你需要换种方法来处理。
三、STDERR
shell通过特殊的STDERR文件描述符来处理错误消息。STDERR文件描述符代表shell的标准错误输出。shell或shell中运行的程序和脚本出错时生成的错误消息都会发送到这个位置。
默认情况下,STDERR文件描述符会和STDOUT文件描述符指向同样的地方(尽管分配给它们的文件描述符值不同)。也就是说,默认情况下,错误消息也会输出到显示器输出中。
但从上面的例子可以看出,STDERR并不会随着STDOUT的重定向而发生改变。使用脚本时,你常常会想改变这种行为,尤其是当你希望将错误消息保存到日志文件中的时候。
以上就是南昌网络公司为大家介绍的关于Linux中的三种标准文件描述符,大家可以了解一下,希望对大家今后的学习有所帮助。此外,百恒网络专注于网站建设、微信开发、南昌物联网开发、APP开发制作等服务,如有需要,欢迎大家来电咨询,洽谈合作!