隐藏命令的输出

隐藏命令的输出

我有一个脚本,用于检查某个包是否已安装以及端口 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-tools和输出,而我不想要这样,我怎样才能隐藏输出并只保留s 的结果?netstat -tlpn | grep 8080 | grep javaif

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

答案1

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

command > /dev/null 2>&1

解释:

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

笔记

&>/dev/null: 将stdout和重定向stderr/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作为,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then

答案2

虽然将输出刷新到/dev/null可能是最简单的方法,但有时/dev/null文件权限设置使得非 root 用户无法在那里刷新输出。因此,另一种非 root 方法是

command | grep -m 1 -o "abc" | grep -o "123"

这个双重设置会在其中grep找到匹配的行,并且由于设置为,因此仅打印一次,并且由于仅打印一次。然后,输出为空或被发送到 grep 以仅查找匹配的字符串部分,并且由于最后一个命令仅输出空字符串,因此返回。希望有所帮助!abc-oabc-m 1abc123abc

答案3

lsof -i :<portnumnber>应该能够按照你想要的方式做一些事情。

相关内容