shell中如何判断某一命令是否存在

参考:

http://www.cnblogs.com/tuzkee/p/3755230.html

https://segmentfault.com/q/1010000000156870

http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script

避免使用which,可用下列命令实现:

$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it‘s not installed.  Aborting."; exit 1; }
$ 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; }

If your hash bang is /bin/sh then you should care about what POSIX says. type and hash‘s exit codes aren‘t terribly well defined by POSIX, and hash is seen to exit successfully when the command doesn‘t exist (haven‘t seen this with type yet). command‘s exit status is well defined by POSIX, so that one is probably the safest to use.

If your script uses bash though, POSIX rules don‘t really matter anymore and both type and hashbecome perfectly safe to use. type now has a -P to search just the PATH and hash has the side-effect that the command‘s location will be hashed (for faster lookup next time you use it), which is usually a good thing since you probably check for its existence in order to actually use it.

As a simple example, here‘s a function that runs gdate if it exists, otherwise date:

gnudate() {
    if hash gdate 2>/dev/null; then
        gdate "[email protected]"
    else
        date "[email protected]"
    fi
}

In summary:

Where bash is your shell/hashbang, consistently use hash (for commands) or type (to consider built-ins & keywords).

When writing a POSIX script, use command -v.

首先要说明的是,不要使用which来进行判断,理由如下:

1、which非SHELL的内置命令,用起来比内置命令的开销大,并且非内置命令会依赖平台的实现,不同平台的实现可能不同。

# type type
type is a shell builtin
# type command
command is a shell builtin
# type which
which is hashed (/usr/bin/which)

2、很多系统的which并不设置退出时的返回值,即使要查找的命令不存在,which也返回0

# which ls
/usr/bin/ls
# echo $?
0
# which aaa
no aaa in /usr/bin /bin /usr/sbin /sbin /usr/local/bin /usr/local/bin /usr/local/sbin /usr/ccs/bin /usr/openwin/bin /usr/dt/bin
# echo $?
0

3、许多系统的which实现,都偷偷摸摸干了一些“不足为外人道也”的事情

所以,不要用which,可以使用下面的方法:

$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it‘s not installed.  Aborting."; exit 1; }
$ 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; }

犀利的原文,可以在这里查看:

http://stackoverflow.com/questions/592620/how-to-check-if-a-program-exists-from-a-bash-script/677212#677212

时间: 2024-12-18 00:42:18

shell中如何判断某一命令是否存在的相关文章

shell中条件判断if中的-z到-d的意思

shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则为真. [ -e FILE ] 如果 FILE 存在则为真. [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真. [ -g FILE ] 如果 FILE 存在且已经设置了SGID则

shell中常用I/O重定向命令格式说明

命令1  >    文件1 将命令1的输出结果重定向到文件1 命令1  &>  文件1 将命令1的输出结果和标准错误输出一起重定向到文件1 命令1  >>  文件1 将命令1的输出结果追加到文件1中 命令1  2>  文件1 将命令1的标准错误输出的结果重定向到文件1中 命令1  <     文件1 将文件1作为命令1的标准输入 命令1 << 字符串1   允许连续输入数据,直到接收到字符串1(常用于邮件系统) shell中常用I/O重定向命令格式说

shell中while循环引用ssh命令的坑

原理shell代码如下: #!/bin/sh cat ../androidsrc | while read line do         ip=$(echo $line | awk '{print $1}')         srcdir=$(echo $line | awk '{print $2}')         destdir=$(echo $line | awk '{print $3}')         user=$(echo $line | awk '{print $4}')  

shell 中的函数优先于 命令

在编译Android的时候 把下面的函数,添加到 envsetup.sh, 再运行 build/envsetup.sh 让其生效 function make() { local make=$(which make) echo "you are running function make" ${make} [email protected] } 而后运行 make, 运行的并不是可执行文件 make, 而是 envsetup 中定义的 make函数 在运行完make之后,如何还想执行别的

shell中条件判断if中的-z到-d

shell中条件判断if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真.[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真. [ -d FILE ] 如果 FILE 存在且是一个目录则为真. [ -e FILE ] 如果 FILE 存在则为真.[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真. [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真

shell中怎么判断输入的是否是数字

在shell中我们经常要面临一个问题就是,怎么判断我交互式的前端,使用者输入的是否是数字呢?这里小编我也就会两种方法,所以今天就在这说一说 第一种:sed格式 首先:我们先(在命令行直接输出模拟一下,如果都正确再在shell脚本中进行书写.)直接echo输出一下 echo "111asd" 第一步:思想 然后我们就要想一下我们要说用sed判断,但是sed的最主要的功能是什么?替换!!!当然是替换,既然是替换那么我们能不能直接把echo输出的数字直接替换掉,然后看这个输出还剩下什么呢?如

Shell中条件判断语法与判断条件

一,简介 Shell各种判断结构和运算符的用法是shell编程的基础,了解shell的判断.运算符和一些退出状态 对后面的学习有很重要的影响.shell有一个内部命令test经常用于对判断语句 进行测试一种或几种状态的条件是否成立 二. 判断条件 (1)Linux的shell中的测试命令,用于测试某种条件或某几种条件是否真实存在 测试命令是判断语句和循环语句中条件测试的工具,对判断和运算符的比较测试有很大的帮助. (2)测试条件为真,返回一个0值:      为假,返回一个非0整数值 测试命令有

shell中if判断条件中使用[],[[]],(())还是test,let的比较

学习shell的时候总是被shell里的条件判断方式搞得头疼,经常不知道改 用[],[[]],(())还是test,let,而很少有书把它们的关系讲解的很清楚(应该是我悟性差或是看书太少),今天总结一下,基础的东西如它们 的使用方法不再赘述,重点说说它们的区别的使用时应该注意的地方. 先说[]和test,两者是一样的,在命令行里test expr和[ expr ]的效果相同.test的三个基本作用是判断文件.判断字符串.判断整数.支持使用与或非将表达式连接起来.要注意的有: 1.test中可用的

shell中条件判断文件, 判断数值, 判断字符; 逻辑比较, test的使用

shell中的条件判断: (选项参考man test) 1. 文件判断: 判断目录存在不存在: test -d /home 执行后使用$?查看结果为0, 表示是目录; test命令无论执行结果如何, 都不会报错, 只会返回0或非0 test -d /home 语法等同于 [ -d /home ] test可使用[来代替, 后面的]只不过是一个参数, 不要把这个当作方括号看待, 人家是个命令啊. 2. 数值判断: if [ $UID -ne 0 ]; then $UID用户判断当前用户是否是roo