前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在bash脚本中如何检查一个命令是否存在

在bash脚本中如何检查一个命令是否存在

作者头像
程序熵
发布2023-09-25 11:00:39
2410
发布2023-09-25 11:00:39
举报
文章被收录于专栏:技术汇

问:

如何验证程序是否存在,以一种要么返回错误并退出,要么继续执行脚本的方式?

这看起来应该很容易,但它一直困扰着我。

答:

POSIX 兼容:

代码语言:javascript
复制
command -v <the_command>

使用示例:

代码语言:javascript
复制
if ! command -v <the_command> &> /dev/null
then
    echo "<the_command> could not be found"
    exit
fi

对于 Bash 特定环境:

代码语言:javascript
复制
hash <the_command> # 用于常规命令。或
type <the_command> # 检查内置项和关键字

避免使用 which。它是一个外部进程,相对而言 hash、type 或 command 这样的内置程序执行效率更高,你还可以依靠内置程序来实际执行所需的操作,而且外部命令的效果很容易因系统而异。

  • 许多操作系统的 which 甚至不会设置退出状态,这意味着 if which foo 甚至不会正常工作,并且总是报告 foo 存在,即使它不存在(注意,一些 POSIX shell 似乎对 hash 也这样做)。
  • 许多操作系统会让 which 做一些自定义和邪恶的事情,比如更改输出,甚至 hook 到包管理器。

所以,不要使用 which,改用以下方法之一:

代码语言:javascript
复制
command -v foo || { echo >&2 "I require foo but it's not installed. Aborting."; return 1; }
代码语言:javascript
复制
type foo || { echo >&2 "I require foo but it's not installed. Aborting."; return 1; }

或者在文件 /etc/profile 末尾追加如下代码:

代码语言:javascript
复制
which() {
  type "$@" || { echo >&2 "I require $@ , but it's not installed.  Aborting."; return 1;}
}

再重开 shell 窗口,即可替代系统原有的 which 命令。


参考:

  • stackoverflow question 592620
  • man bash

相关阅读:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-06 12:58,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档