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

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

我将如何验证一个程序是否存在,或者返回一个错误并退出,或者继续执行这个脚本?

这看起来应该很容易,但它一直在阻挠我。


千万里不及你
浏览 834回答 3
3回答

慕姐8265434

回答兼容POSIX:command&nbsp;-v&nbsp;<the_command>为bash具体环境:hash&nbsp;<the_command>&nbsp;#&nbsp;For&nbsp;regular&nbsp;commands.&nbsp;Or...type&nbsp;<the_command>&nbsp;#&nbsp;To&nbsp;check&nbsp;built-ins&nbsp;and&nbsp;keywords解释避which..这不仅是一个外部进程,您要启动的过程非常少(这意味着内置程序,如hash,&nbsp;type或command),您也可以依赖内置程序来实际执行您想做的事情,而外部命令的效果可能因系统而异。何必在乎?许多操作系统都有一个which那,那个甚至不设置退出状态,意思是if which foo甚至不会在那里工作总报告foo存在,即使它不存在(请注意,一些POSIX shell似乎是这样做的。)hash)。许多操作系统which做一些定制和邪恶的事情,比如改变输出,甚至连接到包管理器。所以,不要用which..相反,请使用以下其中之一:$&nbsp;command&nbsp;-v&nbsp;foo&nbsp;>/dev/null&nbsp;2>&1&nbsp;||&nbsp;{&nbsp;echo&nbsp;>&2&nbsp;"I&nbsp;require&nbsp;foo&nbsp;but&nbsp;it's&nbsp;not&nbsp;installed.&nbsp;&nbsp;Aborting.";&nbsp;exit&nbsp;1;&nbsp;}$&nbsp;type&nbsp;foo&nbsp;>/dev/null&nbsp;2>&1&nbsp;|| &nbsp;{&nbsp;echo&nbsp;>&2&nbsp;"I&nbsp;require&nbsp;foo&nbsp;but&nbsp;it's&nbsp;not&nbsp;installed.&nbsp;&nbsp;Aborting.";&nbsp;exit&nbsp;1;&nbsp;}$&nbsp;hash&nbsp;foo&nbsp;2>/dev/null&nbsp;|| &nbsp;&nbsp;{&nbsp;echo&nbsp;>&2&nbsp;"I&nbsp;require&nbsp;foo&nbsp;but&nbsp;it's&nbsp;not&nbsp;installed.&nbsp;&nbsp;Aborting.";&nbsp;exit&nbsp;1;&nbsp;}(次要的旁注:有些人会建议2>&-是一样的2>/dev/null但更短-这是不真实的.&nbsp;2>&-关闭fd 2,这会导致误差在程序中,当它试图写入stderr时,这与成功地写入它和丢弃输出(和危险!)有很大的不同!如果你的哈希/bin/sh那么你应该关心POSIX说了些什么。type和hashPOSIX没有很好地定义退出代码,而且hash在命令不存在时成功退出(还没有看到type)。commandPOSIX很好地定义了退出状态,因此使用起来可能是最安全的。如果您的脚本使用bash不过,POSIX规则已经不再重要了,两者兼而有之。type和hash完全安全地使用。type现在有一个-P搜索PATH和hash有副作用,即命令的位置将被散列(以便下次使用时更快地查找),这通常是一件好事,因为您可能会检查它的存在,以便实际使用它。作为一个简单的例子,下面是一个运行gdate如果存在,则为date:gnudate()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;hash&nbsp;gdate&nbsp;2>/dev/null;&nbsp;then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gdate&nbsp;"$@" &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;date&nbsp;"$@" &nbsp;&nbsp;&nbsp;&nbsp;fi}

大话西游666

下面是检查命令是否存在于$PATH&nbsp;和是可执行的:[&nbsp;-x&nbsp;"$(command&nbsp;-v&nbsp;foo)"&nbsp;]例子:if&nbsp;!&nbsp;[&nbsp;-x&nbsp;"$(command&nbsp;-v&nbsp;git)"&nbsp;];&nbsp;then &nbsp;&nbsp;echo&nbsp;'Error:&nbsp;git&nbsp;is&nbsp;not&nbsp;installed.'&nbsp;>&2 &nbsp;&nbsp;exit&nbsp;1fi需要进行可执行检查,因为bash返回一个非可执行文件,如果在$PATH.还请注意,如果与可执行文件的名称相同的非可执行文件存在于$PATH,Dash返回前者,即使后者将被执行。这是一个错误,违反了POSIX标准。[错误报告] [标准]此外,如果您要查找的命令被定义为别名,则此操作将失败。
打开App,查看更多内容
随时随地看视频慕课网APP