隐藏命令的输出

dab*_*aba 55 bash scripts

我有一个脚本,用于检查是否安装了软件包以及特定进程是否正在使用端口 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...
Run Code Online (Sandbox Code Playgroud)

但是,当脚本执行时,我在终端中同时获得了dpkg -s net-toolsnetstat -tlpn | grep 8080 | grep java输出,但我不想要那样,如何隐藏输出并只保留ifs的结果?

另外,有没有更优雅的方式来做我正在做的事情?而且有一个更优雅的方式来知道哪些进程正在使用的端口8080(不只是如果了所使用的话),如果有的话?

sou*_* c. 108

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

command > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

解释:

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

笔记

&>/dev/null: 将stdout和都重定向stderr/dev/null. 可以使用它作为替代/dev/null 2>&1

Silentgrepgrep -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
Run Code Online (Sandbox Code Playgroud)

这里 if 条件将像以前一样检查,但不会有任何输出。

回复评论

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

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
Run Code Online (Sandbox Code Playgroud)