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的重定向符号有太多,含义也有不一致),呵呵。

手机做MODEM实现无线上网

前不久和一位售前同事到北京出差,途中在动车上看到他把本子连到Nokia手机上并通过手机上网。现如今通过手机上网也不是什么新鲜事,关键看是否需要。平时上班有公司网络,下班家里有宽带,路途中可通过手机直接浏览WAP站点,所以对于我这样的开发人员而言倒是没有特别充分的让本子通过做MODEM的手机上网的需求。

公司信息安全改造屏蔽了外部的许多站点,其中包括BLOGBUS,而且目前BUS不支持WAP浏览。这让我在白天闲暇时维护自己的博客成为了一件困难事,就这样我也有了通过手机MODEM实现电脑无线上网的需求。当然出差途中也可以通过这种方式处理一些紧急事件。

我的手机现在看来可能已经有些过时了 — 2006年入手的摩托罗拉A780。平时手机最常用的功能就是电话和WAP上网浏览,自从购进后也没有深入探究其各种功能和配置,甚至还未尝试将数据下载到电脑中进行备份,所以如何将A780设置为MODEM并实现本子上网我就更无从知晓了。

不过还好有伟大的Google,搜索了一下,翻阅了多篇网友们的心得体会,感觉都甚是复杂。我先不管那么多了,先让本子认识一下A780这个无线MODEM吧 — 安装一个Motorola USB Driver,一切顺利,可以在“控制面板->“电话和调制解调器”看到我的A780已经成为了一只“MODEM"了。但是接下来按照网上提示的方法去设置和拨号却无论如何也无法连通,尝试了几次后,放弃。

在各种关于A780的资料中,大家都提到了一个摩托手机必备之工具-"motorola phone tools, 简称mpt",该工具能实现手机与电脑的数据同步,甚至可以通过本子编辑短信并发送,这次我也下载一个吧(太落伍了,居然买机若干年后才安装如此"知名"的工具!)。

MPT的包挺大,70多M。而且包内也带有“Motorola USB Driver”。执行之。在左侧的功能列表栏中,功能还是蛮齐全的。试了试联系人、SMS等功能都还好用,就是速度有些慢,也许我的联系人有些多,从手机读取到电脑上竟用了很长时间。

这些功能虽好,但不是我这次想要的。看看是否有我想要的连接Internet的功能呢?在“通讯”->"Internet"中果然看到了希望。点击后,一个生动的界面出现在眼前。点击“管理连接”,弹出窗口让你选择是通过CMWAP还是直连Internet,我首先选了CMWAP,之后点击“连接”,十几秒后提示连接成功。在界面的流量数据中已经有上下行流量变化了。打开IE尝试访问了一下新浪的WAP站点,没有结果,有些失望。断开连接后,再次配置链接属性,这次选择直连Internet,重复以上步骤。在浏览器里输入google的url,若干秒后google的首页就呈现在面前了,上网设置成功。此时我的第一感受就是:这也没有网上很多资料里说的那么复杂啊。不过你要小心了,如果你没有开通移动运营商的无线上网包月套餐业务的话,上网的费用还是相当贵的,所以还是要谨慎点击“连接”。

回想一下,CMWAP之所以不好用,也许跟我的浏览器中公司代理的设置有关,不管了,反正也不用。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系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