linux系统如何选择文件描述符 (从零开始学linux运维描述符)

从零开始学linux运维描述符,linux系统如何选择文件描述符

文件返回值

当我们执行一个命令的时候,命令无论执行成功或者失败,都会给我们返回一个执行后的退出状态

这个状态使用命令"echo $?"查看

如果执行成功,返回值为0

执行了cd命令和ls命令,成功,返回值为0

从零开始学linux运维描述符,linux系统如何选择文件描述符

如果执行失败,返回值不为0

进入一个不存在的目录,报错,返回值为1

输入一个不存在的命令,报错,返回值为127

从零开始学linux运维描述符,linux系统如何选择文件描述符

从上面两图中可以看到,无论执行的命令成功或者失败,大多都是有提示的

对于没有提示的命令,我们就可以通过"echo $?"来看是否成功执行

文件描述符

常用的文件描述符有0,1,2是标准输入,标准输出和错误输出

文件描述符0,是标准输入,默认是键盘输入,也可以是用文件或者其他命令来进行输入

文件描述符1,是标准输出,默认是屏幕,也可以输出到文件

文件描述符2,是标准错误,就是程序执行报错的输出,默认是屏幕,也可以输出到文件

从零开始学linux运维描述符,linux系统如何选择文件描述符

文件输出重定向

需要认识几个符号

">"覆盖重定向

">>"追加重定向

我们先创建一个文件夹"mkdir /root/17test"

进入新建的文件夹"cd /root/17test"

然后试试上面两个重定向符号

先实验追加重定向

"echo 123 >> 17.txt"执行多次,后cat一下这个文件

从零开始学linux运维描述符,linux系统如何选择文件描述符

我执行了3次之后,发现这个文件也是三行,说明输出都重定向到这个文件里面了

如果是用">"覆盖重定向呢

从零开始学linux运维描述符,linux系统如何选择文件描述符

结果显而易见,只有最后一条的值

如果我们重定向的时候报错了会啥样,我们来试试

从零开始学linux运维描述符,linux系统如何选择文件描述符

错误打印到了屏幕上,重定向的文件也被清空了

这里我们加上文件描述符再试一次

从零开始学linux运维描述符,linux系统如何选择文件描述符

错误重定向到了文件里面,没有打印出来

我们新建一个脚本文件,"vim 17.sh",输入两行内容

从零开始学linux运维描述符,linux系统如何选择文件描述符

我们执行一下,"sh 17.sh"

从零开始学linux运维描述符,linux系统如何选择文件描述符

这样一行是标准输出,一行是标准错误,我们将这两条分别重定向到不同的文件

"sh 17.sh >info.txt 2>error.txt"

从零开始学linux运维描述符,linux系统如何选择文件描述符

上面的命令将">"改为">>"就可以追加文件内容,而不是只保留一条了

如果我们想让标准输出和标准错误合并到一个文件,应该怎么处理呢

"sh 17.sh >all.txt 2>&1"

从零开始学linux运维描述符,linux系统如何选择文件描述符

同理,标准输出和标准错误的重定向可以反过来写

"sh 17.sh 2>all.txt 1>&2",效果是一样的

从零开始学linux运维描述符,linux系统如何选择文件描述符

文件输入重定向

command << delimiter

从标准输入中读入,直至遇到delimiter分界符

从零开始学linux运维描述符,linux系统如何选择文件描述符

图中123就是我指定的分界符

我们可以用此方法结合文件输出重定向,创建一个有内容的文本

"echo << fjf >>fjf.txt"

从零开始学linux运维描述符,linux系统如何选择文件描述符