使用终端,确定用户系统上是否安装了名为dcmdump
的二进制文件的最简单方法是什么?如果安装了,我需要知道它的位置(例如/usr/local/bin
),如果没有安装,那么我希望终端回显FALSE
。
我知道很少的终端脚本,但键入:
command -v dcmdump
输出安装了dcmdump的目录(如果已安装 - 这很棒)但如果不是(我希望它回显字符串 FALSE ),则不会回显任何内容
答案 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
也会以稍微不同的形式为您提供该信息。
无论如何,hash
和command -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的左侧是命令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