[英]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 的左侧是命令which dcmdump 2>/dev/null
,右侧是echo FALSE
。which NAME
寻找一个可执行文件名为NAME
在当前shell $PATH
。 如果找到,则将其绝对路径打印到标准输出并以指示“成功”的状态退出,否则,它可能会或可能不会向标准错误输出打印错误消息并返回指示“失败”的状态。which
的错误消息,而是我们自己的,我们将which
的标准错误输出重定向到黑洞/dev/null
和2>/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
也会以稍微不同的形式为您提供该信息。
无论如何, hash
和command -v
和type
都是 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.