为了账号安全,请及时绑定邮箱和手机立即绑定

如何从Bash脚本中检查程序是否存在?

如何从Bash脚本中检查程序是否存在?

如何从Bash脚本中检查程序是否存在?我将如何验证一个程序是否存在,或者返回一个错误并退出,或者继续执行这个脚本?这看起来应该很容易,但它一直在阻挠我。
查看完整描述

3 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

回答

兼容POSIX:

command -v <the_command>

bash具体环境:

hash <the_command> # For regular commands. Or...type <the_command> # To check built-ins and keywords

解释

which..这不仅是一个外部进程,您要启动的过程非常少(这意味着内置程序,如hashtypecommand),您也可以依赖内置程序来实际执行您想做的事情,而外部命令的效果可能因系统而异。

何必在乎?

  • 许多操作系统都有一个

    which

    那,那个

    甚至不设置退出状态

    ,意思是

    if which foo

    甚至不会在那里工作

    报告

    foo

    存在,即使它不存在(请注意,一些POSIX shell似乎是这样做的。)

    hash

    )。
  • 许多操作系统

    which

    做一些定制和邪恶的事情,比如改变输出,甚至连接到包管理器。

所以,不要用which..相反,请使用以下其中之一:

$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed.  Aborting."; exit 1; }$ type foo >/dev/null 2>&1 ||
 { echo >&2 "I require foo but it's not installed.  Aborting."; exit 1; }$ hash foo 2>/dev/null ||
  { echo >&2 "I require foo but it's not installed.  Aborting."; exit 1; }

(次要的旁注:有些人会建议2>&-是一样的2>/dev/null但更短-这是不真实的2>&-关闭fd 2,这会导致误差在程序中,当它试图写入stderr时,这与成功地写入它和丢弃输出(和危险!)有很大的不同!

如果你的哈希/bin/sh那么你应该关心POSIX说了些什么。typehashPOSIX没有很好地定义退出代码,而且hash在命令不存在时成功退出(还没有看到type)。commandPOSIX很好地定义了退出状态,因此使用起来可能是最安全的。

如果您的脚本使用bash不过,POSIX规则已经不再重要了,两者兼而有之。typehash完全安全地使用。type现在有一个-P搜索PATHhash有副作用,即命令的位置将被散列(以便下次使用时更快地查找),这通常是一件好事,因为您可能会检查它的存在,以便实际使用它。

作为一个简单的例子,下面是一个运行gdate如果存在,则为date:

gnudate() {
    if hash gdate 2>/dev/null; then
        gdate "$@"
    else
        date "$@"
    fi}


查看完整回答
反对 回复 2019-06-05
?
大话西游666

TA贡献1817条经验 获得超14个赞

下面是检查命令是否存在于$PATH 是可执行的:

[ -x "$(command -v foo)" ]

例子:

if ! [ -x "$(command -v git)" ]; then
  echo 'Error: git is not installed.' >&2
  exit 1fi

需要进行可执行检查,因为bash返回一个非可执行文件,如果在$PATH.

还请注意,如果与可执行文件的名称相同的非可执行文件存在于$PATH,Dash返回前者,即使后者将被执行。这是一个错误,违反了POSIX标准。[错误报告] [标准]

此外,如果您要查找的命令被定义为别名,则此操作将失败。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 801 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信