如何确定是否使用bash安装了二进制文件?

时间:2015-09-26 20:36:43

标签: bash

使用终端,确定用户系统上是否安装了名为dcmdump的二进制文件的最简单方法是什么?如果安装了,我需要知道它的位置(例如/usr/local/bin),如果没有安装,那么我希望终端回显FALSE

我知道很少的终端脚本,但键入:

command -v dcmdump

输出安装了dcmdump的目录(如果已安装 - 这很棒)但如果不是(我希望它回显字符串 FALSE ),则不会回显任何内容

4 个答案:

答案 0 :(得分:2)

至少在OS X上,让which dcmdump让它说/usr/local/bin/dcmdump(如果找到命令)并不是绝对糟糕的。但是there can be issues with using which in other environments

但是反对which的主要原因是,它是一个单独的命令,没有内置到shell中,所谓的shell “builtins”在完成工作时也是更好的选择。

因此,如果您只想检查命令是否存在(并且不需要知道它在哪里),那么您只需使用内置hash dcmdump并检查返回值即可;例如,echo $?或:

if hash dcmdump 2>/dev/null; then
  echo "OK, you have dcmdump installed. We’ll use that."
else
  echo "You need dcmdump. I can install if for you, OK?"
  read -e -p "Y or N? " yn
  if [[ "y" = "$yn" || "Y" = "$yn" ]]; then
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    brew install dcmtk
  else
    echo "We need dcmdump. Stopping."
    exit
  fi
fi

检查命令存在的选项都没有返回文字字符串 FALSE (正如您在问题中提到的那样);但是使用hash dcmdump并只检查返回值将完成工作。

如果你确实想知道命令的确切位置,那就是command -v会给你的。使用type dcmdump也会以稍微不同的形式为您提供该信息。

无论如何,hashcommand -v以及type都是shell内置插件,因此部分原因是为什么建议which为此。 canonical answer on this at SO提供了更多详细信息。

顺便说一句,如果你的目标是在你的系统上获得dcmdump,你可以通过安装homebrew来实现这一目标:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后,您可以安装dcmtk包:

brew install dcmtk

然后你真的会在dcmdump中有一个/usr/local/bin/dcmdump命令。

答案 1 :(得分:2)

您可以使用:

$ which dcmdump 2>/dev/null || echo FALSE

以下是它的工作原理:

  • 整个表达式是两个命令的布尔OR(写为||)。 OR的左侧是命令which dcmdump 2>/dev/null,右侧是echo FALSE
  • 由于懒惰评估(或短路),如果左侧评估为“真”(或“成功”),则不会评估右侧。否则,它会。
  • 命令which NAME在当前shell NAME中查找名为$PATH的可执行文件。如果找到一个,它将打印其标准输出的绝对路径,并以状态指示“成功”退出,否则,它可能会或可能不会向标准错误输出打印错误消息并返回指示“失败”的状态。 / LI>
  • 由于我们不想要which的错误消息,但我们将错误消息重定向到which的标准错误输出到/dev/null } 2>/dev/null部分。
  • 命令echo TEXT只是将TEXT输出到标准输出。如果您希望将FALSE打印到标准错误输出,则可以使用echo FALSE >&2重定向它。

答案 2 :(得分:0)

您可以使用which并检查返回值是否为空,如下所示:

#!/bin/sh
bi=$(which $1)
if [ -z $bi ]
then
    echo "FALSE"
else
    echo $bi
fi

然后脚本可以像这样运行:

./script command

答案 3 :(得分:0)

POSIX 兼容:

command -v dcmdump || echo FALSE

或者如果您需要重用路径,请使用以下内容

if cmd=$(command -v dcmdump); then echo $cmd; else echo FALSE; fi