コマンドが次のようなときにエラーメッセージを表示しない可能性があることを知っています。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
ただし、最初の項目がゼロ以外の戻りコードで終了した場合、2番目の項目の実行を避けるには、その戻りコードを「マスク」する必要があります。たとえば、サブシェルに入れる必要があります。
{ [[ -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