shell文件描述符

栏目: IT技术 · 发布时间: 4年前

文件描述符 缩写 描述
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 列出打开的文件描述符


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Paradigms of Artificial Intelligence Programming

Paradigms of Artificial Intelligence Programming

Peter Norvig / Morgan Kaufmann / 1991-10-01 / USD 77.95

Paradigms of AI Programming is the first text to teach advanced Common Lisp techniques in the context of building major AI systems. By reconstructing authentic, complex AI programs using state-of-the-......一起来看看 《Paradigms of Artificial Intelligence Programming》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器