“bash:命令:未找到命令”是否返回 false?

“bash:命令:未找到命令”是否返回 false?

我正在编写一个脚本来自动配置软件。我想首先检查脚本是否需要先安装软件,然后配置它。如果我检查$ software --version并得到bash: command: command not found,那么我知道我会首先安装它。

是否bash: command: command not found返回 false?

编辑:对于任何答案,可以解释一下答案吗?

答案1

是的。

$ spamegg
spamegg: command not found

$ echo $?
127

你可以这样做:

if software --version &>/dev/null; then
   ## True, do something
else
   ## False, do something
fi

答案2

如果您的目的是检查特定命令是否可用,您应该这样做而不是尝试执行它:

if command -v spamegg >/dev/null; then
  echo spamegg is available
else
  apt-get install spamegg
fi

尝试执行spamegg以查看它是否可用是一个不好的方法。首先,它会混淆您的代码,使其看起来像是spamegg用于安装某些东西。其次(更重要的是),您正在检查的命令可能存在,但由于某种原因而失败:

if grep >/dev/null 2>&1; then
  echo grep is available
else
  echo grep is not available
fi

grep is not available即使是这样也会输出。

答案3

恕我直言,我不认为你的方法是解决这个问题的最佳方法。原因只是因为命令返回未找到,并不意味着该程序不是已安装。它可能只是表明该程序不位于您的任何 PATH 位置。

也许,更好的方法是实际检查已安装软件包的列表:

RHEL/CentOS:

grep PROGRAM_NAME <(rpm -qa --qf "%{NAME}\n")

Debian/Ubuntu:

grep PROGRAM_NAME <(dpkg --get-selections | awk '{ print $1}')

答案4


# example you need wget and your PATH is okay then:
# bash/ksh/.. will return exit code 127 if command not found
# 
# redirect stdin and stderr to the /dev/null = if exist, 
# output is not interesting
wget --help >/dev/null 2>&1
stat=$?   # variable ? include last command exit status
echo "exit status:$stat"
if ((stat == 127 )) ; then # not exist/found
   echo "install wget"
   exit 1
fi
echo "wget exist, continue"

您还可以使用 if before 命令,但该命令处理所有非 0 的退出代码。

您可以执行任何命令并使用 if 测试退出代码

# 如果命令;然后
# 工作正常
# 别的
# 不太好
# 菲

# negative testing ! = if not exit code 0 then
if ! wget --help >/dev/null 2>&1 ; then
   # give err msg to the stderr and exit 
   echo "install wget / wget didn't work correctly" >&2
   exit 1
fi
echo "wget works fine"

在使用 if 进行测试之前,首先查看工作退出代码

wget --帮助
回声$?
# 将回显 0 = 好的。不为 0 不行
# 如果命令返回不为0,那么你不能使用if来测试,你需要
# 使用退出值 = 127 进行测试

相关内容