以 bash 文档里的一个例子来说:
ls > dirlist 2>&1
以前一直疑惑为什么 2 前面不加&号,写成&2>&1 .
刚看了一些资料,原来 2>连起来是一个操作符(token),这个操作符由 2 和>组成.它的名字就叫做 2>, 这个操作符的功能是"把 stderr 重定位到"....哈哈,算是一种"内含操作数的操作符".
另外两个操作符是:
0>
1>
其中 1>的 1 可以省略,就成了我们日常看到的>号.是省略来的,linux 并没有一个所谓的"重定向符号" > .
挺误导人的吧.好多教程里都没提到这个省略,导致我长期都看不懂.上面命令是这样断句的:
ls
1> dirlist
2> &1
其中&1 里面的&是打标记,表明后面的 1 是 fd 号,不是文件.
再一个问题是,叫做"重定向"其实不好,>号的功能更接近"指针转指",或者说"指针赋值".
像比上面的 2> &1,它实际的功能是:
让"2 号 fd"指向"1 号 fd"所指的内核里的 file descriptor object .
这类似于 java 里的改变引用对象:
s1 = s2
s1 被指到 s2 所指的 object .
或者类似于 C 语言里的指针赋值:
p1 = p2
2> &1 前面的 1> dirlist 这句,已经把"1 号 fd"转指到 dirlist 这个文件的 descriptor object 了.即,"1 号 fd"引用的已经不是 stdout 这个文件了.
所以 2> &1 最终的效果是,把 stderr 也重定位到 dirlist 文件上去.
但对新手来说,2> &1 的直观感觉,就是"把本该输出到 stderr 的内容重定向到 stdout 上去",对吧.你都说了是"重定向"了.
如果叫做"指针修改符",用户反而会警觉,心里念叨着 1 现在指着哪儿.而且他们会注意到,2>这个操作符,操作对象并不是"本该输出到 stderr 的内容",而是"原本引用着 stderr 文件的 2 号 fd",是在操控它的指向.
搜帖子的时候,看到 csdn 上的一篇文章,令我倍感欣慰:
https://blog.csdn.net/niu91/article/details/79869505?utm_source=blogxgwz3大家看他文章的第一段就行了,我感觉到他的思路跟这几年的我一模一样. 而且他挺厉害的了,理解错了,还能把语法写对,我之前好像连语法都凑不出来
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/512834
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.