举例
$ ls
test1.txt test2.txt
$ ls test1.txt test2.txt
test1.txt test2.txt
$ ls test1.txt test2.txt test3.txt
ls: cannot access 'test3.txt': No such file or directory
test1.txt test2.txt
$ ls test1.txt test2.txt test3.txt > /dev/null
ls: cannot access 'test3.txt': No such file or directory
$
$ ls test1.txt test2.txt test3.txt > /dev/null 2>&1
$
疑问
请问 2>&1 为什么 可以放在 $ ls test1.txt test2.txt test3.txt > /dev/null 而不报错,这符合 shell 语法吗?
答案:
重定向可以出现在命令行的任何位置(只要在命令名之后)
多个重定向从左到右依次处理
每个重定向独立解析
基本语法
command [重定向1] [重定向2] [重定向3] ...
关键点:重定向操作符(>、<、>>、2>&1 等)可以任意顺序出现在命令名之后、参数之前或之后
Shell 在解析命令行时,会:
识别命令名(第一个非重定向/非赋值的词)
识别所有重定向(无论位置)
收集所有参数(非重定向的词)
按从左到右的顺序应用重定向
具体解析步骤
步骤1:词法分析
$ ls test1.txt test2.txt test3.txt > /dev/null 2>&1
│ │ │ │ │
命令 参数 重定向 文件 重定向
步骤2:识别所有重定向
重定向1:> /dev/null (将 stdout 指向 /dev/null)
重定向2:2>&1 (将 stderr 指向 stdout 当前指向的位置)
步骤3:按顺序执行
初始状态:stdout → 终端,stderr → 终端
执行重定向1:> /dev/null
stdout → /dev/null
stderr → 终端(未变)
执行重定向2:2>&1
stderr → stdout 当前指向(/dev/null)
最终状态:stdout → /dev/null,stderr → /dev/null
类比理解
想象有两个水管:
水管1(stdout):流正常的水
水管2(stderr):流脏水
终端:你的水桶(默认两个水管都流向水桶)
1>&1:
告诉水管1:"流向水管1自己"
结果:水管1还是流向水桶(没变化)
没用
2>&1:
告诉水管2:"流向水管1当前流的方向"
如果水管1流向水桶,脏水也去水桶(没变化)
但如果水管1被改道流向黑洞(/dev/null),脏水也跟着去黑洞
很有用:可以同时控制两个水管的方向
9938



被折叠的 条评论
为什么被折叠?



