隐藏命令的输出

Modified on: Sun, 10 Jun 2018 06:12:53 +0800

我有一个脚本,用于检查是否安装了软件包以及特定进程是否正在使用端口8080。我对bash没有任何经验,所以我做了类似的事情:

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

然而,当脚本执行时,我得到dpkg -s net-toolsnetstat -tlpn | grep 8080 | grep java输出,我不想这样,我怎么能隐藏输出,只是坚持if的结果?

此外,是否有更优雅的方式来做我正在做的事情?是否有更优雅的方式来了解什么进程正在使用端口8080(不仅仅是它正在使用),如果有的话?

作者:dabadaba

最佳答案

要隐藏任何命令的输出,通常stdoutstderr会重定向到/dev/null

command > /dev/null 2>&1

解释强>

1. command > /dev/null:将command(stdout)的输出重定向到/dev/null
2. 2>&1:将stderr重定向到stdout,因此错误(如果有的话)也会转到/dev/null

注意强>

&>/dev/null:将stdoutstderr重定向到/dev/null。可以使用它作为/dev/null 2>&1

的替代品

无声grepgrep -q "string"以无提示或静默方式匹配字符串,无需任何标准输出。它也可以用来隐藏输出。

在您的情况下,您可以像使用

一样使用它

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

这里将检查if条件,但不会有任何输出。

回复评论 强>:

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1:它在第二个管道之后重定向从grep java引出的输出。但是您从netstat -tlpn获得的消息。解决方案是使用第二个if as,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
作者:Community,souravc

相关问答

添加新评论