Shell脚本中如何获取二进制程序执行结果并赋值给变量?
解决Shell脚本中获取二进制程序执行结果的问题
先明确下背景:你有个二进制程序/usr/local/bin/check_master,通过环境变量CHECK_MASTER指向它,执行后会输出0或1;在脚本里用tee能看到终端输出,但尝试常规方法赋值变量时遇到了问题。下面针对两个问题逐一解答:
问题1:直接用文件路径获取执行结果赋值给变量VAR
其实用命令替换就能轻松搞定,这是Shell里捕获命令输出的标准方式。具体写法如下:
# 基础版:仅捕获程序的标准输出 VAR=$(/usr/local/bin/check_master)
如果你的这个程序偶尔会往标准错误(stderr)输出一些无关内容,这些内容会干扰变量的值,那可以把stderr重定向到/dev/null来过滤掉:
# 过滤stderr干扰的版本 VAR=$(/usr/local/bin/check_master 2>/dev/null)
要是你还想同时在终端看到输出(就像用tee那样),可以把命令替换和tee结合起来:
# 既赋值变量又在终端显示输出 VAR=$(/usr/local/bin/check_master | tee /dev/tty)
命令替换$()会自动捕获命令的stdout内容,把它赋值给VAR,完全符合你的需求。
问题2:使用环境变量$CHECK_MASTER来获取结果
和问题1的逻辑完全一致,只是把硬编码的路径换成环境变量引用就行:
# 基础版 VAR=$($CHECK_MASTER)
同样的,要是需要过滤stderr或者同时显示终端输出,调整如下:
# 过滤stderr并显示终端输出 VAR=$($CHECK_MASTER 2>/dev/null | tee /dev/tty)
你说之前尝试这个写法没生效?可以先排查两个点:
- 脚本运行时能不能正确读取到
CHECK_MASTER变量?在脚本开头加一行echo "CHECK_MASTER的值是:$CHECK_MASTER",确认路径是否正确。 - 是不是脚本的执行环境问题?比如用
sudo运行脚本时,环境变量会被重置,这时候需要用sudo -E来保留原有环境变量,确保CHECK_MASTER能被读取到。
内容的提问来源于stack exchange,提问作者Paul Stewart
相关产品推荐
相关产品推荐

