Linux 文件描述符

了解Linux怎样处理输入和输出是非常重要的。一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置。同样我们也可以更好地理解输入重定向和输出重定向。

Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。其实我们可以想象我们电脑的显示器和键盘在Linux系统中都被看作是文件,而它们都有相应的文件描述符与之对应。

其实我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。那么我们可以把上面表格中的文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘的; 文件描述符1理解为我和计算机交互时的输出,而这个输出默认是指向显示器的;文件描述符2理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置;

就像我上面说的那样,既然它们是默认的,我就可以更改它们。下面的命令就是把标准输出的位置改到xlinsist文件中:

exec 1> xlinsist

这回如果我输入ls -al 或者ps命令,我们的终端将不会显示任何东西。现在,我们可以新开一个终端查看xlinsist这个文件中是否有上面两个命令所显示的内容。注意:你必须新开一个终端。

同样的道理,我们也可以改变标准输入的位置。首先,我们先看看没改变的样子:

vincent@geek:~/test$ read user
xlinsist
vincent@geek:~/test$ echo u s e r x l i n s i s t v i n c e n t @ g e e k :   / t e s t user xlinsist vincent@geek:~/test userxlinsistvincent@geek: /test

也就是我们从键盘输入把xlinsist读入到user变量。这个read需要我输入。现在,我要改变标准输入的默认位置:

#我只是把当前的标准输出重定向到test文件中
vincent@geek:~/test$ echo ‘xlinsist’ 1> test
vincent@geek:~/test$ cat test
xlinsist
#我只是把当前的标准输入重定向到test文件中
vincent@geek:~/test$ read user 0< test
vincent@geek:~/test$ echo u s e r x l i n s i s t v i n c e n t @ g e e k :   / t e s t user xlinsist vincent@geek:~/test userxlinsistvincent@geek: /test

从上面的read命令中可以看作,我并没有被要求输入什么。

标准错误输出和标准输出的区别是,它在命令出错情况下的输出。这没有什么太大的不同,我们也可以把它的输出修改到任何我们想要的位置。只不过我们需要把上面标准输出的1改成2,命令如下:

exec 2> xlinsist

当然,除了0, 1,2以外,我们可以分配自己的文件描述符。看下面的例子:

vincent@geek:~/test$ exec 6>test
vincent@geek:~/test$ echo ‘i love linux shell!!!’ 1>&6
vincent@geek:~/test$ cat test
i love linux shell!!!

上面的命令很有意思:我首先把文件描述符6指向test文件。因为不像描述符1,所有的输出都会自然找它,然后看它是定向到显示器还是某个文件。所以当我们想找描述符6的时候我们要用&来引用它。其实我们可以把文件描述符想像成一个文件的引用,它可以指向任何一个文件(包括显示器),指向的过程就是我们修改默认位置的过程。而用&符号来找到它指向的目标文件,从而向其写入数据。

如果你真正了解了上面的原理后,我们就可以随便玩什么输入重定向啊、输出重定向啊,那都是小case。现在让我们来个更加复杂的例子吧,来帮你们整理一下思路,脚本如下:

exec 3>&1
exec 1>test
echo “这句话被存到test文件中”
echo “还有这句”
exec 1>&3
echo “这句话输出到显示器”

我们来一步一步理解上面的命令:首先文件描述符1默认指向的是显示器,用&来找到文件描述符1指向的目标文件,也就是显示器。因此文件描述符3也指向了显示器。然后,我们修改了文件描述符1指向的文件到test文件。接着两个echo命令的输出会自然去找文件描述符1,然后它看到文件描述符1指向的是test文件,所以它会把输出写到test文件中。最后,我们用&来找到文件描述符3指向的目标文件,也就是显示器,然后我们修改了文件描述符1指向的文件到显示器。因此,最后一个echo命令会自然的找文件描述符1然后输出到显示器上。

整个过程就是这样的,只要你理解了它们的原理,以后无论在脚本中怎样处理重定向的你都不会感觉到迷茫了。下面我将介绍一些与文件描述符相关的一些shell命令,这可以让你如虎添翼。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值