CentOS 7下Bash脚本中fuser命令冗余输出及-s模式返回空问题
解决CentOS 7下fuser命令的冗余输出与-s模式空值问题
我来帮你理清这个问题,其实核心是两个点:冗余信息的输出渠道和-s模式的设计逻辑。
一、如何避免X/tcp:这类冗余输出?
你之前的重定向> /dev/null没生效,是因为fuser输出的X/tcp:这类提示信息不是到标准输出(stdout),而是到标准错误(stderr),而你只重定向了stdout。
正确的做法是把stderr也一起重定向到/dev/null,这样就能完全屏蔽冗余输出,同时正常捕获PID。修改后的代码示例:
# 捕获X/tcp端口的PID,同时屏蔽所有冗余输出 some_pid=$(fuser X/tcp 2>/dev/null) # 捕获Y/tcp端口的PID another_pid=$(fuser Y/tcp 2>/dev/null) # 正常进行空值判断 if [[ -z "$some_pid" ]]; then echo "端口X/tcp未被占用" else echo "端口X/tcp被PID $some_pid 占用" fi
这里的2>/dev/null就是把stderr(文件描述符2)的内容丢弃,只保留stdout的PID结果供变量捕获。
二、为什么-s静默模式会返回空值?
fuser的-s参数设计初衷是静默执行,不输出任何内容到stdout,它只通过命令的退出状态码来告知结果:
- 退出码为0:表示目标端口/文件有进程占用
- 退出码非0:表示没有进程占用
所以当你用$(...)去捕获-s模式的输出时,自然会得到空值——因为它根本没输出任何内容到stdout。如果想用-s模式,应该通过判断命令的退出状态来逻辑处理,而不是捕获输出:
# 使用-s模式判断端口是否被占用(不直接获取PID) if fuser X/tcp -s 2>/dev/null; then # 退出码0,说明端口被占用,此时可以再执行一次fuser获取PID some_pid=$(fuser X/tcp 2>/dev/null) echo "端口X/tcp被PID $some_pid 占用" else echo "端口X/tcp未被占用" fi
不过这种方式需要执行两次fuser,不如直接用第一种重定向stderr的方式高效,适合只需要判断端口状态、不需要PID的场景。
内容的提问来源于stack exchange,提问作者mizenetofa1989
相关产品推荐
相关产品推荐

