繁体   English   中英

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

[英]How can I determine if a binary is installed using bash?

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

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

command -v dcmdump

输出目录 dcmdump 安装在(如果已安装 - 这很好)但如果没有则没有回显(我希望它回显字符串FALSE

你可以使用这个:

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

下面是它的工作原理:

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

至少在 OS X 上,执行which dcmdump让它说/usr/local/bin/dcmdump (如果它找到命令)并不是绝对坏的。 但是在其他环境中使用which可能会出现问题

不过,最主要的丁对which的一般是,它是不是内置在外壳一个单独的命令,和所谓的壳“内建”是更好的选择,当他们做一样好工作。

因此,如果您只想检查命令是否存在(并且不需要知道它在哪里),您可以使用内置的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 -vtype都是 shell 内置hash ,所以这就是为什么推荐which用于此的部分原因。 SO 上对此规范答案提供了更多详细信息。

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

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

然后,您可以安装dcmtk包:

brew install dcmtk

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

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

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

然后脚本可以这样运行:

./script command

POSIX兼容:

command -v dcmdump || echo FALSE

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM