Bash中如何测试一个名称/字符串对应的是可执行程序?
Bash中如何测试一个名称/字符串对应的是可执行程序?
我来帮你捋清楚这个问题~你遇到的麻烦其实很典型:用[[ -x cp ]]没反应,用type又会把内置命令、别名这些都算成“存在”,根本不是你要的真正可执行程序对吧?
先拆解下你之前的尝试为什么不行:
[[ -x cp ]]:这个判断的是当前目录下有没有叫cp的可执行文件,而系统自带的cp在/bin/cp,当前目录没有的话自然返回假。它只对指定路径的文件有效,没法直接找PATH里的命令。type ls:type命令会匹配所有shell能识别的命令类型——内置命令(比如cd)、别名、函数、外部程序都算,所以哪怕你输入个不存在的东西(比如你例子里的-fat,其实是type把-f当成了选项,at当成了命令),只要shell能解析出对应的类型,就会返回成功,根本区分不了是不是真正的外部可执行程序。
那正确的做法是什么?给你两个靠谱的方案:
方案一:用type -P精准找外部可执行程序
type -P的作用很专一:只在PATH路径里找外部可执行文件,找到就返回它的绝对路径,找不到就返回空。用这个来判断刚好符合你的需求:
# 替换成你要测试的命令名 COMMAND="ls" if type -P "$COMMAND" >/dev/null; then echo "YES,$COMMAND 是可执行程序" else echo "NO,$COMMAND 不是可执行程序或不存在" fi
测试下:
- 输入
ls会输出YES - 输入
cd(内置命令)会输出NO - 输入
fat(不存在的命令)会输出NO
方案二:用type -t判断命令类型
type -t会返回命令的类型字符串,其中file就代表这是一个外部可执行程序,其他类型比如builtin(内置命令)、alias(别名)、function(函数)都不符合你的需求:
COMMAND="cp" if [[ $(type -t "$COMMAND") == "file" ]]; then echo "YES,$COMMAND 是可执行程序" else echo "NO,$COMMAND 不是可执行程序" fi
这个方案的好处是能明确知道命令的类型,适合需要区分不同命令类型的场景。
总结一下:如果你只是想快速判断某个名字是不是PATH里的可执行程序,用type -P最直接;如果需要更细致的类型判断,就用type -t配合条件判断。
备注:内容来源于stack exchange,提问作者Dumb
相关产品推荐
相关产品推荐

