检查一个文件是否可执行

我想知道什么是最简单的方法来检查程序是否可以用bash执行,而不执行它? 它至less应该检查文件是否具有执行权限,并且与当前系统具有相同的体系结构(例如,不是Windows可执行文件或其他不受支持的体系结构,如果系统是32位,则不是64位)。

看看各种testing操作员(这是testing命令本身,但内置的BASH和TCSHtesting差不多)。

您会注意到-x FILE表示FILE存在并且执行(或search)权限被授予

BASH,Bourne,Ksh,Zsh脚本

 if [[ -x "$file" ]] then echo "File '$file' is executable" else echo "File '$file' is not executable or found" fi 

TCSH或CSH脚本:

 if ( -x "$file" ) then echo "File '$file' is executable" else echo "File '$file' is not executable or found" endif 

要确定文件的types ,请尝试使用file命令。 你可以parsing输出,看看它是什么types的文件。 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-64i386或具有32-bit SPARC )。


附录

非常感谢,这似乎是要走的路。 在我把这个标记为我的答案之前,能否请你指导一下我在“文件”上执行什么样的脚本shell检查(即,什么样的parsing)来检查我是否可以执行一个程序? 如果这样的testing在一般基础上难以完成,我至less要检查它是否是可执行文件或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 

基本上,我正在运行testing,那么如果这是成功的,我做一个grep的file命令的输出。 grep -q表示不打印任何输出,但使用grep的退出代码来查看是否find了string。 如果你的系统没有使用grep -q ,你可以尝试使用grep "regex" > /dev/null 2>&1

同样, file命令的输出可能因系统而异,所以您必须validation这些文件可以在您的系统上运行。 另外,我正在检查可执行位。 如果一个文件是一个二进制可执行文件,但可执行位不是,那么我会说这是不可执行的。 这可能不是你想要的。

似乎没有人注意到, -x操作符不会与目录不同的文件。

所以要精确地检查可执行文件,可以使用[[ -f SomeFile && -x SomeFile ]]

也似乎没有人注意符号链接-x操作符。 一个符合链接(链)到一个普通文件(不分类为可执行文件)通过testing失败。