我有一个脚本,用于检查某个包是否已安装以及端口 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 java
if
另外,有没有更优雅的方式来做我正在做的事情?有没有更优雅的方式来知道什么进程是否正在使用端口 8080(不仅仅是它是否正在被使用),如果有的话?
答案1
要隐藏任何命令的输出,通常stdout
和stderr
重定向至/dev/null
。
command > /dev/null 2>&1
解释:
1.command > /dev/null
command
:将(stdout)的输出重定向到/dev/null
2。2>&1
: 重定向stderr
到stdout
,因此错误(如果有)也会转到/dev/null
笔记
&>/dev/null
: 将stdout
和重定向stderr
到/dev/null
。你可以使用它作为/dev/null 2>&1
沉默的grep
:grep -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
-o
abc
-m 1
abc
123
abc
答案3
lsof -i :<portnumnber>
应该能够按照你想要的方式做一些事情。