检查文件是否可执行

2023-12-06

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


看看各种test运算符(这是针对测试命令本身的,但内置的 BASH 和 TCSH 测试或多或少是相同的)。

你会注意到-x FILE says 文件存在并授予执行(或搜索)权限.

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

确定type文件的大小,尝试file命令。您可以解析输出以准确查看它是什么类型的文件。警告字: 有时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

The 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, or SPARC with 32-bit).


Addendum

非常感谢,这似乎是可行的方法。在我将此标记为我的答案之前,您能否指导我必须对“文件”执行哪种类型的脚本 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

基本上,我正在运行测试,如果成功,我会对输出进行 grepfile命令。这grep -q意味着不打印任何输出,但使用 grep 的退出代码来查看是否找到该字符串。如果您的系统不支持grep -q, 你可以试试grep "regex" > /dev/null 2>&1.

再次,输出file命令可能因系统而异,因此您必须验证这些命令是否适用于您的系统。另外,我正在检查可执行位。如果一个文件是二进制可执行文件,但可执行位未打开,我会说它不可执行。这可能不是您想要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查文件是否可执行 的相关文章

  • 路径中的波形符不会扩展到主目录

    假设我有一个名为Foo位于 home user my home user也代表为 我想要一个变量 a Foo 然后做 cd a I get bash cd Foo No such file or directory 但是如果我这样做cd F
  • 如何在 Bash 脚本中将heredoc写入文件?

    如何在 Bash 脚本中将此处文档写入文件 阅读高级 Bash 脚本指南第 19 章此处文档 http tldp org LDP abs html here docs html 这是一个将内容写入文件的示例 tmp yourfilehere
  • bash 脚本中的 JQ 参数错误

    我的 JQ 查询有问题 max script lt return integer jq r notifiestext map select read false temp notif jq arg foo max map select id
  • 递归触摸修复计算机之间的同步[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 由于我的错误 我正在寻找一种从命令行触摸目录 和子目录 中的每个文件的方法 我的同步存储库在我的开发机器上有点不同步 我现在已经通过一些令人不快的巫术
  • “bash -c 命令参数”末尾的参数的目的是什么?

    From man bash If the c option is present then commands are read from the first non option argument command string If the
  • 使用 tac 和 sed 反转文件

    我有一个用例 我需要搜索并替换文件中最后一次出现的字符串并将更改写回文件 下面的案例是该用例的简化版本 我正在尝试反转该文件 进行一些更改 再次将其反转并写入该文件 我为此尝试了以下代码片段 tac test sed s a b sed i
  • Jenkins 文本参数 - 特殊字符乱码(不需要的变量替换)

    我在 Jenkins Linux 下 有一份工作构建参数 https wiki jenkins ci org display JENKINS Parameterized Build类型为 文本 我使用参数来形成在构建过程中使用的文件的内容
  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • shell脚本中的“##”是什么意思? [复制]

    这个问题在这里已经有答案了 在编写脚本时 我遇到了这个命令 f file 我很想知道 什么是 这行是什么意思 In bash 它删除了前缀模式 在这里 它基本上为您提供了最后一个路径分隔符之后的所有内容 通过贪婪地删除前缀 后面跟随任意数量
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • Bash 中所有匹配的^单词^替换^?

    为了澄清 我正在寻找一种方法来执行global搜索并替换先前使用的命令 word replacement 似乎只替换了第一场比赛 有没有一些set我无法选择的选项 尝试这个 echo oneone oneone gs one two Rep
  • 关键字“if”如何测试一个值是真还是假?

    在 bash 脚本中 if 1 then echo Yes else echo No fi Output Yes 它表示 1 被视为真值 但在代码中 word Linux letter nuxi if echo word grep q le
  • 如何使用 docker ENTRYPOINT 与 shell 脚本文件组合参数

    我编写 shell 脚本文件并将其与 docker ENTRYPOINT 一起使用 但是当我运行 docker image 时 由于入口点代码行 它只是停止而没有任何错误日志 我的 Dockerfile FROM ubuntu 16 04
  • 通过 bash 命令设置 gitlab-ci.yml 变量

    variables CUSTOM NODE VERSION cat nvmrc 我想要变量CUSTOM NODE VERSION通过内容填充 nvmrc文件 位于项目根目录中 如何在gitlab ci yml file 上面的例子不起作用
  • 以不敏感的方式在 bash 中查找路径

    假设一条路径像 home albfan Projects InSaNEWEBproJECT 尽管事实上不使用这样的名称 有没有办法以不敏感的方式检查路径 我遇到了这个解决方案 但如果可能的话 我想找到一个内置或 gnu 程序 functio
  • bash 子 shell 中出现陷阱“kill 0”的分段错误

    我正在尝试编写一个并行构建多个 Dockerfile 的小脚本 但是如果我想取消该脚本 我也想杀死子进程 这样做的结果是segmentation fault 不知道为什么 为了澄清我正在杀死脚本 C trap kill 0 SIGINT S
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何在 Bash 中按自然顺序循环文件?

    我使用以下命令循环目录中的所有文件 for i in fas do some code done 不过 我按这个顺序得到它们 vvchr1 fas vvchr10 fas vvchr11 fas vvchr2 fas 代替 vvchr1 f
  • 静默检查 bash 脚本中是否存在 rpm

    我正在尝试使用 if 语句快速检查 rpm 是否安装在 bash 脚本中 但我想默默地做 目前 当我运行脚本并且 rpm 确实存在时 它将 rpm 的输出输出到我不想要的屏幕 if rpm qa grep glib then do some

随机推荐

  • 无法将“User”分配给 FutureBuilder 中的参数类型“Future

    我试图确定用户是否使用 FirebaseAuth instance currentUser 登录 Flutter Firebase 然后返回 LoginScreen 或 Dashboard 但出现错误 我尝试根据 FirebaseFlutt
  • 在运行时更改 IconTintColorBehavior 的 TintColor 不起作用

    你好 我正在测试新的IconTintColorBehavior在 CommunityToolkit Maui 1 1 0 中 它可以查找 但仅在启动应用程序时有效 如果我改变AppTheme在运行时 它不起作用 还有其他人观察过这种行为吗
  • 滑动功能无法使用 jquerymobile 和 android 的phonegap 工作

    我是phonegap的新手 我正在使用phonegap for android在eclipse中创建应用程序 我在xml文件夹中添加了phonegap jar和插件 我还添加了jquery库和phonegap1 1 0 js 我正在尝试实现
  • 在python中生成正弦波声音

    我一直在尝试使用以下代码生成正弦波并在我的扬声器中播放它 但这听起来很糟糕 有人知道为什么吗 听起来不像正弦波 dur int FS float duration 1000 for i in range dur a frequency i
  • 连接到服务器上运行的 virtualenv/django 时如何解决 ERR_CONNECTION_REFUSED

    我已经在 ubuntu 服务器上的用户部分安装了 virtualenv 和 Django 一切似乎都安装正确 当我启动服务器时python manage py runserver我收到以下消息 这似乎是正确的 Performing syst
  • 以绘图单位指定 matplotlib 散点大小

    我想不使用点或像素而是使用绘图单位来指定散点大小 以下面为例 import matplotlib pyplot as plt x 0 y 0 plt scatter x y plt show 这会产生如下图 比如说 如果我希望标记的半径恰好
  • Ansible 将多个异步任务注册到同一变量

    有没有办法将多个异步任务注册到同一个变量 例如 如果我有两个任务 每个任务都调用异步 shell 命令 name Run async task 1 shell echo task 1 async 30 poll 0 register db
  • 如何检测圆形视图内的触摸

    我有一个圆形的 UIView 我必须仅检测紫色圆圈内的触摸 所有在圆圈外的触摸 例如黑色方块和白色背景必须被忽略 设置半径和检测触摸将没有任何用处 因为当多个视图使用不同的控制器彼此重叠时 将很难管理 有什么办法吗 我可以做到这一点 请您给
  • 无法在 iOS 应用程序中使用自定义字体

    我正在尝试为我的 iOS 应用程序使用自定义字体 这就是我所做的 我将自定义字体 m tff 添加到 Xcode 支持文件目录 此外 我还在 myApp plist 中创建了应用程序提供的名为 Fonts 的条目 其中包含字体的值名称 m
  • 如何在 .NET 中将 HTML 转换为 RTF(富文本)而无需支付组件费用? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有免费的第三方或 NET 类可以将 HTML 转换为 RTF 用于支持富文本的 Windows 窗体控件 免费 要求来自这样一个事实 我只在开发
  • 动态添加节点到 d3.js 力向图

    我在动态添加节点到 d3 js 强制定向图时遇到问题 我想知道这里是否有人可以阐明这个主题 我遇到的问题是我希望刻度函数进行转换all图上的节点而不仅仅是新添加的节点 以下是我用于添加节点和处理转换的函数 Function to handl
  • Google App Engine“没有名为请求的模块”PyDev

    我下载并安装了requestsPython 2 7 的库 使用 shell 我可以发出 导入请求 并实际使用它 不会出现任何问题 问题是 运行 Google App Engine 时找不到它并提示错误 导入错误 没有名为请求的模块 我使用
  • Swing JTabbedPane 在填充时抛出 IndexOutOfBoundsException

    我有一个包含多个组件的应用程序 其中之一是JTabbedPane里面还有其他东西 显然 我访问此窗格only通过这个吸气剂 public JTabbedPane getPlotTabbedPane if plotTabs null plot
  • Gulp、html 模板和片段加载

    当我通过 gulp 任务运行生成的 html 文件时 我想在生成的 html 文件中的各个位置导入 html 片段 以下是我的 gulp 任务 gulp task build html function gulp src resources
  • protobuf-net 使用 DynamicType 序列化 System.Object 会引发异常

    在我的应用程序中 我正在序列化消息以使用 protobuf net 通过网络发送 每条消息都有一个用于标头信息的键值对列表 但是 我遇到了一个异常 并且我已经能够用一个非常简单的示例来重现它 TestFixture public class
  • LibGDX:粒子尺度

    在我的游戏中我使用 static final float FRUSTUM WIDTH 10 static final float FRUSTUM HEIGHT 15 所以当我绘制粒子时 它们占据了整个屏幕并且非常巨大 那么我如何缩小它们以满
  • Neo4j:使用可选关系实现软删除

    我正在尝试在 Neo4j 中实现软删除 从 Alice 的角度来看 Cypher 中描述的图是这样的 clyde User lt FOLLOWS alice User LIKES gt bob User 我没有实际删除节点及其关系 而是 更
  • Java中删除字符串的一部分

    我想从一个字符中删除字符串的一部分 即 源字符串 manchester united with nice players 目标字符串 manchester united 有多种方法可以做到这一点 如果您有要替换的字符串 可以使用replac
  • Spring Data 查询方法中的可选参数

    我想在存储库层编写一些查询方法 此方法必须忽略空参数 例如 List
  • 检查文件是否可执行

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