我想知道用bash检查一个程序是否可执行的最简单的方法是什么?它至少应该检查文件是否具有执行权限,以及是否具有相同的体系结构(例如,不是windows可执行文件或其他不受支持的体系结构,如果系统是32位,则不是64位,...)作为当前的系统。
发布于 2012-04-26 00:27:38
看一下各种测试操作符(这是用于test命令本身的,但是内置的BASH和TCSH测试大致相同)。
您会注意到,-x FILE显示文件存在,并且授予了执行(或搜索)权限。
BASH、Bourne、Ksh、Zsh脚本
if [[ -x "$file" ]]
then
echo "File '$file' is executable"
else
echo "File '$file' is not executable or found"
fiTCSH或CSH脚本:
if ( -x "$file" ) then
echo "File '$file' is executable"
else
echo "File '$file' is not executable or found"
endif要确定该文件的类型,请尝试使用file命令。您可以解析输出以查看其确切的文件类型。Word 'o警告:有时file会返回多行。下面是在我的Mac上发生的情况:
$ file /bin/ls
/bin/ls: Mach-O universal binary with 2 architectures
/bin/ls (for architecture x86_64): Mach-O 64-bit executable x86_64
/bin/ls (for architecture i386): Mach-O executable i386根据操作系统的不同,file命令会返回不同的输出。然而,executable这个词将出现在可执行程序中,而且通常架构也会出现。
将上面的代码与我在Linux机器上得到的代码进行比较:
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped和一个Solaris机器:
$ file /bin/ls
/bin/ls: ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped在这三种语言中,您将看到单词executable和体系结构(x86-64、i386或带有32-bit的SPARC )。
附录
非常感谢,这似乎就是我们要做的。在我把这个标记为我的答案之前,你能指导我,为了检查我是否可以执行一个程序,我必须在'file‘上执行什么样的脚本shell检查(即,什么样的解析)?如果这样的测试太难在一般基础上进行,我至少想检查一下它是linux可执行文件还是osX (Mach-O)。
不经意间,你可以在BASH中做这样的事情:
if [ -x "$file" ] && file "$file" | grep -q "Mach-O"
then
echo "This is an executable Mac file"
elif [ -x "$file" ] && file "$file" | grep -q "GNU/Linux"
then
echo "This is an executable Linux File"
elif [ -x "$file" ] && file "$file" | grep q "shell script"
then
echo "This is an executable Shell Script"
elif [ -x "$file" ]
then
echo "This file is merely marked executable, but what type is a mystery"
else
echo "This file isn't even marked as being executable"
fi基本上,我正在运行测试,如果测试成功,我将对file命令的输出执行grep。grep -q表示不打印任何输出,但使用grep的退出代码查看是否找到了该字符串。如果您的系统不接受grep -q,您可以尝试使用grep "regex" > /dev/null 2>&1。
同样,file命令的输出可能因系统而异,因此您必须验证这些命令在您的系统上是否有效。另外,我正在检查可执行代码。如果一个文件是二进制可执行文件,但是可执行文件位没有打开,我会说它不是可执行文件。这可能不是您想要的。
发布于 2016-09-14 19:17:55
似乎没有人注意到,-x操作员并没有将文件与目录区分开来。
因此,要精确地检查可执行文件,您可以使用[[ -f SomeFile && -x SomeFile ]]
发布于 2018-04-07 21:20:41
测试文件、目录和符号链接
这里给出的解决方案在目录或符号链接(或两者)上都失败。在Linux上,您可以使用以下命令测试文件、目录和符号链接:
if [[ -f "$file" && -x $(realpath "$file") ]]; then .... fi在OS上,你应该能够用homebrew安装coreutils并使用grealpath。
定义isexec函数
为了方便起见,您可以定义函数:
isexec() {
if [[ -f "$1" && -x $(realpath "$1") ]]; then
true;
else
false;
fi;
}或者简单地说
isexec() { [[ -f "$1" && -x $(realpath "$1") ]]; }然后,您可以使用以下命令进行测试:
if `isexec "$file"`; then ... fihttps://stackoverflow.com/questions/10319652
复制相似问题