文件描述符
缩写
描述
0
STDIN
标准输入
1
STDOUT
标准输出
2
STDERR
标准错误
1、STDIN
STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。shell从STDIN 文件描述符对应的键盘获得输入,在用户输入时处理每个字符。
在使用输入重定向符号(<)时,Linux会用重定向指定的文件来替换标准输入文件描述符。 它会读取文件并提取数据,就如同它是键盘上键入的
2、STDOUT
STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。shell 的所有输出(包括shell中运行的程序和脚本)会被定向到标准输出中,也就是显示器。
通过输出重定向符号,通常会显示到显示器的所有输出会被shell重定向到指定的重定向文件。你也可以将数据追加到某个文件。这可以用>>符号来完成
3、STDERR
shell对于错误消息的处理是跟普通输出分开的。如果你创建了在后台模式下运行的shell脚 本,通常你必须依赖发送到日志文件的输出消息。
STDERR文件描述符代表shell的标准错 误输出。shell或shell中运行的程序和脚本出错时生成的错误消息都会发送到这个位置。
默认情况下,STDERR文件描述符会和STDOUT文件描述符指向同样的地方(尽管分配给它们 的文件描述符值不同)。也就是说,默认情况下,错误消息也会输出到显示器输出中
4、重定向错误、数据
4.1 只重定向输出
使用重定向输出符号> 或者追加>>
4.2 只重定向错误
STDERR文件描述符被设成2。可以选择只重定向错误消息,将该文 件描述符值放在重定向符号前。该值必须紧紧地放在重定向符号前,否则不会工作。
例:
ls -al badfile 2> test
现在运行该命令,错误消息不会出现在屏幕上了。该命令生成的任何错误消息都会保存在输 出文件中。
4.3 重定向错误和数据
ls -al test test2 test3 badtest 2> test6 1> test7
shell利用1>符号将ls命令的正常输出重定向到了test7文件,而这些输出本该是进入STDOUT 的。所有本该输出到STDERR的错误消息通过2>符号被重定向到了test6文件
也可以将STDERR和STDOUT的输出重定向到同一个输出文件。为此bash shell 提供了特殊的重定向符号&>
$ ls -al test test2 test3 badtest &> test7
当使用&>符时,命令生成的所有输出都会发送到同一位置,包括数据和错误。为了避免错误信息散落在输出文件中,相较于标准输出,bash shell自动赋予了错误消息更高的优先级。
5、重定向输出
5.1 临时重定向
echo "This is an error message" >&2
这行会在脚本的STDERR文件描述符所指向的位置显示文本,而不是通常的STDOUT
如果像平常一样运行这个脚本,你可能看不出什么区别。
$ cat test8
#!/bin/bash
# testing STDERR messages
echo "This is an error" >&2
echo "This is normal output"
$ ./test8
This is an error
This is normal output
默认情况下,Linux会将STDERR导向STDOUT。但是,如果你在运行脚本时重定向了 STDERR,脚本中所有导向STDERR的文本都会被重定向。
$ ./test8 2> test9
This is normal output
$ cat test9
This is an error
5.2 永久重定向
如果脚本中有大量数据需要重定向,那重定向每个echo语句就会很烦琐。取而代之,你可 以用exec命令告诉shell在脚本执行期间重定向某个特定文件描述符。
$ cat test10
#!/bin/bash
# redirecting all output to a file exec 1>testout
echo "1"
echo "2"
echo "3"
$ ./test10
$ cat testout
1
2
3
exec命令会启动一个新shell并将STDOUT文件描述符重定向到文件。脚本中发给STDOUT的所 有输出会被重定向到文件
6、重定向输入
通过输入重定向,当使用read命令时就不必从键盘处读取数据,而是指定的文件处
exec 0< testfile
这个命令会告诉shell它应该从文件testfile中获得输入,而不是STDIN。这个重定向只要 在脚本需要输入时就会作用
$ cat test12
#!/bin/bash
# redirecting file input
exec 0< testfile count=1
while read line
do
echo "Line #$count: $line"
count=$[ $count + 1 ]
done
$ ./test12
Line #1: This is the first line.
Line #2: This is the second line.
Line #3: This is the third line.
将STDIN重定向到文件后, 当read命令试图从STDIN读入数据时,它会到文件去取数据,而不是键盘。
7、创建自己的重定向
7.1 创建输出文件描述符
exec 3>test13out
echo "and this should be stored in the file" >&3
和标准的文件描述符一样,一旦将另一个文件 描述符分配给一个文件,这个重定向就会一直有效,直到你重新分配
exec 3>>test13out
7.2 重定向文件描述符
exec 3>&1
exec 1>test14out
exec 1>&3
第一个exec将文件描述符3重定向到文件描述符1 的当前位置,也就是STDOUT。这意味着任何发送给文件描述符3的输出都将出现在显示器上。
第二个exec命令将STDOUT重定向到文件,shell现在会将发送给STDOUT的输出直接重定向到 输出文件中。但是,文件描述符3仍然指向STDOUT原来的位置,也就是显示器。如果此时将输出 数据发送给文件描述符3,它仍然会出现在显示器上,尽管STDOUT已经被重定向了
第三个exec将STDOUT重定向到文件描述符 3的当前位置(现在仍然是显示器)。这意味着现在STDOUT又指向了它原来的位置:显示器
( 个人理解,这个用法相当于运算时由于需要临时将变量A初始值赋给变量B,此时B的值就是A初始值,随后将变量A值更换掉,最后因为需要所以将变量B值(即A的初始值)又赋给A )
7.3 创建输入文件描述符
7.4 创建读写文件描述符
7.5 列出打开的文件描述符
Please enable JavaScript to view the comments powered by Disqus.