首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查文件是否可执行

检查文件是否可执行
EN

Stack Overflow用户
提问于 2012-04-26 00:16:41
回答 7查看 145.2K关注 0票数 94

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-04-26 00:27:38

看一下各种测试操作符(这是用于test命令本身的,但是内置的BASH和TCSH测试大致相同)。

您会注意到,-x FILE显示文件存在,并且授予了执行(或搜索)权限。

BASH、Bourne、Ksh、Zsh脚本

代码语言:javascript
复制
if [[ -x "$file" ]]
then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
fi

TCSH或CSH脚本:

代码语言:javascript
复制
if ( -x "$file" ) then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
endif

要确定该文件的类型,请尝试使用file命令。您可以解析输出以查看其确切的文件类型。Word 'o警告:有时file会返回多行。下面是在我的Mac上发生的情况:

代码语言:javascript
复制
$ 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机器上得到的代码进行比较:

代码语言:javascript
复制
$ 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机器:

代码语言:javascript
复制
$ file /bin/ls
/bin/ls:        ELF 32-bit MSB executable SPARC Version 1, dynamically linked, stripped

在这三种语言中,您将看到单词executable和体系结构(x86-64i386或带有32-bitSPARC )。

附录

非常感谢,这似乎就是我们要做的。在我把这个标记为我的答案之前,你能指导我,为了检查我是否可以执行一个程序,我必须在'file‘上执行什么样的脚本shell检查(即,什么样的解析)?如果这样的测试太难在一般基础上进行,我至少想检查一下它是linux可执行文件还是osX (Mach-O)。

不经意间,你可以在BASH中做这样的事情:

代码语言:javascript
复制
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命令的输出可能因系统而异,因此您必须验证这些命令在您的系统上是否有效。另外,我正在检查可执行代码。如果一个文件是二进制可执行文件,但是可执行文件位没有打开,我会说它不是可执行文件。这可能不是您想要的。

票数 126
EN

Stack Overflow用户

发布于 2016-09-14 19:17:55

似乎没有人注意到,-x操作员并没有将文件与目录区分开来。

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

票数 23
EN

Stack Overflow用户

发布于 2018-04-07 21:20:41

测试文件、目录和符号链接

这里给出的解决方案在目录或符号链接(或两者)上都失败。在Linux上,您可以使用以下命令测试文件、目录和符号链接:

代码语言:javascript
复制
if [[ -f "$file" && -x $(realpath "$file") ]]; then .... fi

在OS上,你应该能够用homebrew安装coreutils并使用grealpath

定义isexec函数

为了方便起见,您可以定义函数:

代码语言:javascript
复制
isexec() {
    if [[ -f "$1" && -x $(realpath "$1") ]]; then
        true;
    else
        false;
    fi;
}

或者简单地说

代码语言:javascript
复制
isexec() { [[ -f "$1" && -x $(realpath "$1") ]]; }

然后,您可以使用以下命令进行测试:

代码语言:javascript
复制
if `isexec "$file"`; then ... fi
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10319652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档