Shell 重定向错误输出
笔者准备写一个 Shell 脚本,需要获取一行命令的错误输出,存于一个变量中,供后续使用。
首先是获取输出内容到变量:
IN=`echo hello`
或者:
IN=$(echo hello)
这样将会把标准输出 hello
存在变量 IN
中。
但是上述方法只能获取标准输出(stdin),不能获取标准错误(stderr)。于是需要重定向输出:
IN=`ls /aaa 2>&1`
如果路径 /aaa
不存在,那么上述命令会产生一个标准错误输出,而用 2>&1
则可以把标准错误重定向到标准输出,于是就能存于变量 IN
中。
在 Shell 中,在一条命令末尾加上 >
即可重定向输出。可以重定向到文件(echo hello > /tmp/in
)、设备(echo hello > /dev/null
)以及输出类别(echo hello >&2
)等。
直接用 >
默认重定向标准输出。若要声明被重定向的输出类别,可以用 1>
重定向标准输出,用 2>
重定向标准错误。于是上述代码中 2>&1
就是把标准错误重定向到标准输出,以便被变量获取。
当然,笔者只想保留标准错误,需要筛去标准输出,此时需要同时把原标准输出重定向到 /dev/null
。/dev/null
相当于一个黑洞,或者说垃圾桶,可以把不需要的东西都重定向到这里去。重定向标准输出到 /dev/null
写作 1>/dev/null
。
所以最终代码是
IN=`ls /aaa 2>&1 1>/dev/null`
注意,这个重定向的顺序是有影响的。依经验看,上述重定向顺序是正确的。
声明:未经作者允许禁止转载