好像今天才看明白 Linux 的重定向语法.

2018-11-29 18:39:06 +08:00
 autumn2018
以 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

大家看他文章的第一段就行了,我感觉到他的思路跟这几年的我一模一样. 而且他挺厉害的了,理解错了,还能把语法写对,我之前好像连语法都凑不出来
1611 次点击
所在节点    程序员
5 条回复
sbw
2018-11-29 18:57:46 +08:00
>& 才是一起的吧,POSIX file descriptor 0 为 stdin 1 为 stdout 2 为 stderr
autumn2018
2018-11-29 19:32:51 +08:00
@sbw
谢谢回复.用空格实验了一下(下面用下划线表示空格,怕看不清).
ls > dirlist 2>&1  改成:
ls > dirlist 2>&_1  回车正常
ls > dirlist 2> _&1  回车运行出错:bash: syntax error near unexpected token `&'
看来&确实跟>是绑在一起的.

但改成 ls > dirlist 2_>& 1   也出错  ls: cannot access '2': No such file or directory
那应该就是:2>&这三个字符是绑在一起的.
sbw
2018-11-29 20:04:05 +08:00
@autumn2018 > 要和前面的字符连起来是因为不连起来的话没法区分前面的 2 是参数还是指的描述符。
根据语法 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_06
>& 是一个操作符
lance6716
2018-11-29 20:41:51 +08:00
bash 这种工具看文档就好了啊…怎么还瞎想…
https://www.gnu.org/software/bash/manual/html_node/Redirections.html
autumn2018
2018-11-29 22:02:23 +08:00
@sbw 多谢链接.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/512834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX