如何在bash脚本的变量中存储命令“哪个”的输出?

时间:2020-09-09 08:46:31

标签: bash macos shell

环境:

Mac OS Catalina 10.15

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

问题:

我有一个bash脚本。

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

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

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

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

  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的技巧。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您的脚本有错误:

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。但是,如果找不到whichport命令实际上不会输出任何内容(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
相关问题