Linux Bash重定向位置差异及2>/dev/null失效问题解析
Bash重定向位置差异与权限错误问题解析
四个命令的重定向位置差异
命令1:
echo "hello" > /test.txt
仅将echo的标准输出(stdout,即内容"hello")重定向到/test.txt。若无文件写入权限,shell会将权限错误信息输出到标准错误(stderr),也就是终端。命令2:
echo "hello" > /test.txt 2>/dev/null
写法上2>/dev/null放在命令末尾,但shell会从左到右处理重定向:先执行> /test.txt的文件打开操作,失败时直接输出错误;后续的2>/dev/null来不及屏蔽这个提前产生的错误。命令3:
echo 2>/dev/null "hello" > /test.txt
将2>/dev/null作为echo命令的前置重定向参数,shell会先处理这个重定向,将echo(内置命令,由shell执行)的stderr指向/dev/null。后续处理> /test.txt时产生的错误会被已生效的2>/dev/null屏蔽,因此终端无错误输出。命令4:
2>/dev/null echo "hello" > /test.txt
属于命令前缀重定向,shell会先将整个命令执行流程的stderr重定向到/dev/null,之后处理> /test.txt时的权限错误会被这个全局重定向捕获,终端无错误输出。
第二条命令2>/dev/null不生效的原因
- 重定向处理顺序:shell执行命令时从左到右解析重定向,
> /test.txt先被处理——尝试打开文件写入,此时无权限直接触发错误,而2>/dev/null在错误产生后才被解析,无法回溯屏蔽已输出的错误。 - 错误来源:
echo是shell内置命令,权限错误并非来自echo本身,而是shell在准备执行命令、处理重定向阶段产生的。只有当2>/dev/null在这个阶段前生效,才能捕获该错误。
内容的提问来源于stack exchange,提问作者ymping
相关产品推荐
相关产品推荐

