如何验证程序是否存在,以返回错误并退出,或继续执行脚本?
看起来应该很容易,但这让我很为难。
如何验证程序是否存在,以返回错误并退出,或继续执行脚本?
看起来应该很容易,但这让我很为难。
当前回答
以下是检查命令是否存在于$PATH中并可执行的便携式方法:
[ -x "$(command -v foo)" ]
例子:
if ! [ -x "$(command -v git)" ]; then
echo 'Error: git is not installed.' >&2
exit 1
fi
需要进行可执行检查,因为如果$PATH中找不到具有该名称的可执行文件,bash将返回一个不可执行文件。
还请注意,如果$PATH中存在与可执行文件同名的不可执行文件,则dash会返回前者,即使后者会被执行。这是一个bug,违反了POSIX标准。[错误报告][标准]编辑:从破折号0.5.11(Debian 11)开始,这似乎是固定的。
此外,如果要查找的命令已定义为别名,则此操作将失败。
其他回答
以下是检查命令是否存在于$PATH中并可执行的便携式方法:
[ -x "$(command -v foo)" ]
例子:
if ! [ -x "$(command -v git)" ]; then
echo 'Error: git is not installed.' >&2
exit 1
fi
需要进行可执行检查,因为如果$PATH中找不到具有该名称的可执行文件,bash将返回一个不可执行文件。
还请注意,如果$PATH中存在与可执行文件同名的不可执行文件,则dash会返回前者,即使后者会被执行。这是一个bug,违反了POSIX标准。[错误报告][标准]编辑:从破折号0.5.11(Debian 11)开始,这似乎是固定的。
此外,如果要查找的命令已定义为别名,则此操作将失败。
hash foo 2>/dev/null:适用于Zshell(Zsh)、Bash、Dash和ash。
type-p foo:它似乎可以使用Z shell、Bash和ash(BusyBox),但不能使用Dash(它将-p解释为一个参数)。
命令-vfoo:适用于Z shell、Bash、Dash,但不适用于ash(BusyBox)(-ash:command:not found)。
还要注意,内置的ash和Dash不可用。
尝试使用:
test -x filename
or
[ -x filename ]
从条件表达式下的Bash手册页:
-x文件如果文件存在且可执行,则为True。
我会尝试调用程序,例如--version或--help,并检查命令是否成功或失败
与set-e一起使用时,如果找不到程序,脚本将退出,您将得到一条有意义的错误消息:
#!/bin/bash
set -e
git --version >> /dev/null
我使用这个,因为它非常简单:
if [ $(LANG=C type example 2>/dev/null | wc -l) = 1 ]; then
echo exists;
else
echo "not exists";
fi
or
if [ $(LANG=C type example 2>/dev/null | wc -l) = 1 ]; then
echo exists
else
echo "not exists"
fi
它使用shell内置程序和程序的回声状态进行标准输出,而不使用标准错误。另一方面,如果找不到命令,它只会将状态返回到标准错误。