我知道当命令是时我们可以抑制错误消息ls
ls /usr/tbin/httpd || /home/app/httpd/bin/apachectl 2>/dev/null
但是,我想抑制No such file or directory
以下命令。不幸的2>/dev/null
是没有帮助。
# /usr/tbin/httpd -v || /home/app/httpd/bin/apachectl -v 2>/dev/null
-bash: /usr/tbin/httpd: No such file or directory
Server version: Apache/2.4.12 (Unix)
Server built: Apr 7 2015 19:15:22
# echo $?
0
您能否建议我如何抑制上面示例中的错误消息?
答案1
最好通过在执行之前测试第一个消息是否存在来完全避免生成消息:
{ [[ -x /usr/tbin/httpd ]] && /usr/tbin/httpd -v ; } || /home/app/httpd/bin/apachectl -v
但是,如果您想避免在第一个以非零返回代码退出时运行第二个,则必须“屏蔽”其返回代码,例如将其放入子 shell 中:
{ [[ -x /usr/tbin/httpd ]] && ( /usr/tbin/httpd -v ; exit 0 ; ) } || /home/app/httpd/bin/apachectl -v
或者在命令组中:
{ [[ -x /usr/tbin/httpd ]] && { /usr/tbin/httpd -v ; true ; } } || /home/app/httpd/bin/apachectl -v
也就是说,一个普通的旧if
语句可以被认为更具可读性:
if [[ -x /usr/tbin/httpd ]]
then
/usr/tbin/httpd -v
else
/home/app/httpd/bin/apachectl -v
fi