如何在Bash脚本中存储which命令输出?MacPorts检测问题
解决MacOS下检测MacPorts安装状态的脚本问题
首先咱们拆解下你遇到的两个核心问题:
为什么which port的输出存不到变量里?
你用的是MacOS自带的BSD版本which,它和GNU版本的which行为差异很大——当找不到指定命令时,它不会输出任何内容(不管是标准输出还是标准错误),只会返回一个非零的退出状态码。这就是为什么你用OUTPUT=$(which port 2>&1)后变量是空的,因为压根没有内容可捕获。你之前在终端直接输入which port时看到的提示,大概率是bash的补全反馈,不是which命令本身的输出。
为什么port -v会打开终端中断脚本?
这是MacPorts的特性:如果你的shell环境还没把MacPorts的路径(默认是/opt/local/bin)加到PATH里,直接执行port命令会触发MacPorts的配置助手,弹出专门的终端窗口帮你设置环境变量,自然就打断了脚本执行。
靠谱的解决方案:用command -v替代which
command -v是POSIX标准命令,跨平台行为一致,专门用来检测命令是否存在,完全适配脚本场景。它的逻辑很清晰:
- 若命令存在,返回命令的绝对路径(输出到stdout),退出状态码为0
- 若命令不存在,无任何输出,退出状态码非0
改进后的脚本如下:
# 检测port命令是否存在,重定向所有输出到/dev/null避免干扰 if command -v port >/dev/null 2>&1; then echo "MacPort is installed" else echo "MacPort is NOT installed" fi
更稳妥的备选方案:检查安装目录
如果你担心PATH配置导致误判,可以直接从文件系统层面检测MacPorts的默认安装目录和核心执行文件:
# 检查/opt/local目录存在,且port命令可执行 if [ -d "/opt/local" ] && [ -x "/opt/local/bin/port" ]; then echo "MacPort is installed" else echo "MacPort is NOT installed" fi
这种方法跳过了shell路径的影响,适合一些特殊场景下的检测需求。
内容的提问来源于stack exchange,提问作者Gauthier Buttez
相关产品推荐
相关产品推荐

