标签 Bash 下的文章

Bash文件描述符重定向符号的另类理解

在Unix平台工作的人都使用过Shell的重定向功能,多数人接触较多的是简单的重定向,比如:
cmd > some_file 将cmd命令的标准输出重定向到some_file中
cmd < some_file 将some_file的内容作为cmd命令执行的标准输入,或者简单的说cmd命令从some_file读取输入

等等诸如此类的简单重定向还比较好理解的,起码从大于号或者小于号的箭头方向也可以感性的理解出来。但是类似Bash Shell中还有一些带有复杂符号的重定向功能,看起来就不那么直观了。

强记是不好的学习方式,加上个人理解的记忆才更牢固,使用起来才更为熟练。昨天晚上为了琢磨一个shell重定向命令,翻看相关bash shell重定向的资料,突然脑子里蹦出一个很容易理解的记忆shell文件描述符重定向的方法。

以“make 2>&1 1>build.log”为例,看起来挺头疼,符号增多了,加了一个'&'这个符号,有些晕。不能看表面,我们要看原理:打开“Unix环境高级编程(APUE)”中关于文件内核数据结构的说明,回顾一下,再对应上面的重定向命令。文件描述符重定向是什么?按照书中描述重定向就是进程文件描述符表项改变所指向的文件表项的操作。当make启动后,进程内部文件描述符表中元素1-> 文件表项1, 元素2->文件表项2,元素3 -> 文件表项3,三个文件表项又分别对应v节点表中的不同v节点。但是做了重定向后,"2>&1"将进程内部文件描述符表中的元素2指向文件表项1,与元素1指向相同,这时该进程文件描述符表中有两个文件描述符指向文件表项1了; "1>build.log"将进程内部文件描述符表中的元素1指向build.log对应的文件表项3。这样make执行过程中的标准输出会写入build.log中,而标准错误则会输出到屏幕上。

好了回顾完原理,再看看“make 2>&1 1>build.log”这个命令,'&'在C语言里是取地址的操作符,对应上面原理的描述,把&1看作是取1对应的文件表项;2>&1 则理解为将进程文件描述符表中元素2指向到元素1所对应文件表项上去。1>build.log理解为:将进程文件描述符表中元素1指向到元素3(build.log对应的文件描述符)所对应文件表项上去。这样理解起来就轻松多了。'<'也类似,cmd < som_file等价于cmd 0<some_file。

Shell平时用的不多,研究的也不多,所以用了这么多年才有这样粗浅的理解(这个理解也不一定通用,bash的重定向符号有太多,含义也有不一致),呵呵。

“扶正”Bash Shell

近日,Bash Shell正式发布了其4.0版本,该版本可以看作3.x的bugfix版,同时增加了诸如"Associative Arrays"等新特性。在Bash Shell的官方站点你可以下载到最新的4.0版本,不过在GNU的Bash主页上,似乎还找不到4.0版本的所在。Bash作为Linux系统默认Shell,一直受到广泛关注,而且它还是目前几大Shell(Bourne Shell, C ShellKorn Shell、Bash Shell)里唯一还继续维护和更新的Shell版本了,目前其主要维护者是Chet Ramey,Bash的两个原始作者之一。

部门内部一直使用C Shell作为Unix账户的默认Shell,估摸着一切源于“继承性”。以前对Shell的关注不多,认为只是工具,用什么Shell都无所谓;近来一直在关注工具使用的高效性,Bash Shell也就再次进入我的视野,花了三天时间将《学习Bash》这本书通读了一遍,收获颇丰,纠正了我以前很多对Shell错误的理解,也加深了我对Shell的认识。《学习Bash》这本书市面上已经绝版了,各大网购站点都亮出“缺货”字样。其英文原版是Oreilly的“Learning the bash shell 2nd edition”,而目前最新版本则是“Learning the bash shell 3rd edition”,内容变化不大,没有中文译版,可以到网上下载电子版阅读。

Bash在命令行编辑下支持的Emacs和Vi模式让我使用起来很得心应手,这样即使在命令行下我也可以使用VI的快捷键对命令行进行编辑,手指可以完全不用离开键盘的常用操作区。这也直接促使我将Bash“扶正”。昨天已经让管理员把我的Unix帐户从C Shell正式换成了Bash Shell。

现在也逐渐认识到:深入理解Shell脚本更有助于你深入理解Unix的文化,对在Unix上写程序也大有裨益。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats