【问题标题】:How to store the output of command "which" in a variable in a bash script?如何将命令“which”的输出存储在 bash 脚本的变量中?
【发布时间】:2020-09-09 08:46:31
【问题描述】:

环境:

Mac OS Catalina 10.15

GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin19)

问题:

我有一个 bash 脚本。

我尝试测试是否安装了 MacPOrt。

当我运行命令“port -v”时,它会打开 Macport 终端,而我的脚本的其余部分已损坏。

所以我尝试使用命令“哪个端口”的另一种方法。 它给出了输出“未找到端口”,但我没有成功将它存储在变量中。我的变量是空的。

您可以在下面看到我的 bash 脚本执行 2 个命令的源代码:

  1. 第一个给出一个空值。
  2. 如果没有安装 Macport,第二个会给出一个值。但如果安装了它,它会打开 Macport 终端并破坏我的代码。
OUTPUT=$(which port 2>&1)

echo "OUTPUT is $OUTPUT"

if echo "$OUTPUT" | grep -q "port not found"; then

    echo "MacPort is NOT installed"

else

    echo "MacPort is installed"

fi

echo "======================================================================"

OUTPUT=$(port -v 2>&1)

echo "OUTPUT is $OUTPUT"

if echo "$OUTPUT" | grep -q "command not found"; then

    echo "MacPort is NOT installed"

else

    echo "MacPort is installed"

fi

这是输出:

OUTPUT is 
MacPort is installed
======================================================================
OUTPUT is test.sh: line 11: port: command not found
MacPort is NOT installed

所以看起来“哪个”命令的行为不像其他命令。如何存储“哪个”命令的输出? 如果不可能,我同意接受任何其他测试 Macport 安装的技巧。

【问题讨论】:

  • 无法重现(尽管此处不在 MacOS 上)。 OUTPUT=$(which port 2>&1) 后跟 echo $OUTPUT 给了我 which: no port in ($PATH)。注意“没有端口”,而不是“找不到端口”。无论如何,OUTPUT 对我来说不是空的。

标签: bash macos shell


【解决方案1】:

如果您真正要查找的只是检查 port 命令是否可用,那么在 bash 中执行此操作的正确方法是:

if ! command -v port > /dev/null; then
  echo "MacPort is not installed"
  exit 1
fi

【讨论】:

    【解决方案2】:

    您的脚本有错误:

    OUTPUT=$(which port 2>&1)
    
    echo "OUTPUT is $OUTPUT"
    
    if echo "$OUTPUT" | grep -q "port not found"; then
        echo "MacPort is NOT installed"
    else
        echo "MacPort is installed"
    fi
    

    您正在检查port not command。但是,如果找不到portwhich 命令实际上不会输出任何内容(which 在不同系统上输出的内容是否不同)。这可以在您的输出中看到(OUTPUT 为空)。

    无论如何,你不能依赖which,因为它可能不会输出任何东西 在某些版本中,甚至它的返回码在某些旧平台上也不可靠。

    更好的办法是使用command or type built-ins的bash(这样也可以避免调用像which这样的外部命令):

    if type port &>/dev/null; then
        echo "MacPort is installed"
    else
        echo "MacPort is NOT installed"
    fi
    

    if command -v port &>/dev/null; then
        echo "MacPort is installed"
    else
        echo "MacPort is NOT installed"
    fi
    

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2022-08-10
      • 1970-01-01
      • 2021-12-03
      • 2021-07-04
      • 2014-10-21
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多