设为首页 收藏本站
查看: 795|回复: 0

shell中检查某个命令是否存在

[复制链接]

尚未签到

发表于 2018-8-25 06:09:53 | 显示全部楼层 |阅读模式
  原文出处:
  http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script
  不要使用which,因为相对于hash、type、command等内置命令,它不仅是一个功能不强大的外置命令。而且要依赖内置命令才能实现你的需求,同时在各个系统上的作用也有不同之处。
  为啥要在意这些细节呢?

  •   很多linux发行版上的which执行完后甚至没有返回码,这就意味着在上面执行完"if which foo"就不会奏效,即使"foo"命令 不存在,系统也会报告存在,这样明显是适得其反。(部分POSIX风格的shell对hash命令也会有类似情况)
  •   很多linux发行版上的which会做一些邪恶的事情,比如改变输出结果甚至会接入到包管理器中。
  因此,不要使用which,建议使用以下命令:
$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed.  Aborting."; e  
$ 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>&-”会关闭掉命令执行出错时产生的文件描述符“2”,这与“2>/dev/null”的命令执行成功后将结果定向到空设备中是完全不一样的。)
  如果你的hash-bang是“/bin/sh”,那么你就需要关注一下POSIX说明。POSIX中type及hash命令的返回码定义得不是很好,hash命令貌似是命令不存在是会返回成功(type中尚未发现此现象)。POSIX中command命令的返回码定义得很好,因此command命令或许是三者中最安全的。
  如果你的脚本运行环境是bash的话,POSIX中的规则就不会造成任何影响,type和hash两个均可安全使用。type可使用-P参数来查找命令所在路径,hash的话会有副作用,它会将命令所在的位置哈希一遍(为了提高下次的查询速度),这通常是一件好事,因为为了能使用上某个命令,你可能会检查它是否存在。
  以下面的gnudate函数为例,如果gdate命令存在就运行之,否则运行date命令。
gnudate() {  
    if hash gdate 2>/dev/null; then
  
        gdate "$@"
  
    else
  
        date "$@"
  
    fi
  
}
  小结:
  当你的shell环境是bash时,一般使用hash或type命令。
  当写一个POSIX风格的脚本时,则使用"command -v"



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-556067-1-1.html 上篇帖子: 让我们的linux的shell命令待颜色 下篇帖子: Linux Shell脚本测试案例(三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表