如何在 Linux 中检查文件是否可执行

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何使用多种方法来判断 Linux 系统中的文件是否可执行。首先,你会使用带有 -x 选项的 test 命令来检查文件的可执行权限,并了解如何解读其退出状态。

接下来,你将探索如何使用 ls -l 命令查看文件的详细权限信息,并识别可执行标志。最后,你将学习如何使用 stat 命令检查文件的访问信息,这为确认文件是否可执行提供了另一种方法。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") linux/BasicSystemCommandsGroup -.-> linux/test("Condition Testing") linux/BasicFileOperationsGroup -.-> linux/ls("Content Listing") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") subgraph Lab Skills linux/echo -.-> lab-558712{{"如何在 Linux 中检查文件是否可执行"}} linux/test -.-> lab-558712{{"如何在 Linux 中检查文件是否可执行"}} linux/ls -.-> lab-558712{{"如何在 Linux 中检查文件是否可执行"}} linux/chmod -.-> lab-558712{{"如何在 Linux 中检查文件是否可执行"}} linux/cd -.-> lab-558712{{"如何在 Linux 中检查文件是否可执行"}} end

使用 test -x 测试可执行性

在这一步中,你将学习如何使用带有 -x 选项的 test 命令来检查文件是否可执行。test 命令是一个 shell 内置命令,用于计算条件表达式。-x 选项专门用于检查文件的可执行权限。

首先,让我们在你的 ~/project 目录下创建一个简单的文本文件。我们将使用 echo 命令把一些文本写入一个名为 my_script.sh 的文件中。

echo "echo 'Hello from the script!'" > ~/project/my_script.sh

现在,让我们检查这个文件是否可执行。默认情况下,当你以这种方式创建一个新文件时,它不会有执行权限。

使用 test -x 命令,后面跟上文件的路径:

test -x ~/project/my_script.sh

运行此命令后,如果测试成功(即文件不可执行),你将看不到任何输出。如果文件是可执行的,test -x 会返回状态码 0,在 shell 脚本中,这通常被解释为“真”或“成功”,但默认情况下它不会在终端上打印任何内容。

为了查看 test 命令的结果,我们可以使用 $? 来检查上一个命令的退出状态。退出状态为 0 表示测试为真(文件可执行),非零状态(通常为 1)表示测试为假(文件不可执行)。

echo $?

你应该会看到输出为 1,这表明 my_script.sh 当前不可执行。

现在,让我们使用 chmod 命令使文件可执行。chmod 用于更改文件和目录的权限。我们将使用 +x 为文件的所有者添加执行权限。

chmod +x ~/project/my_script.sh

现在,让我们再次测试文件的可执行性:

test -x ~/project/my_script.sh

然后检查退出状态:

echo $?

这次,输出应该是 0,这证实了文件现在是可执行的。

最后,让我们尝试运行这个脚本以查看输出:

~/project/my_script.sh

你应该会看到:

Hello from the script!

这证实了你已成功使文件可执行并运行了它。

使用 ls -l 检查权限

在这一步中,你将学习如何使用 ls -l 命令查看文件的详细权限。该命令提供长列表格式,显示文件和目录的各种属性,包括权限、所有者、大小和修改时间。

如果你还不在 ~/project 目录,请导航到该目录。你可以使用 cd 命令:

cd ~/project

现在,使用 ls -l 命令列出该目录中的文件:

ls -l

你应该会看到类似以下的输出(日期和时间等具体细节会有所不同):

-rwxr-xr-x 1 labex labex   30 <date> <time> my_script.sh

让我们来分析输出的第一部分,它代表文件的权限:-rwxr-xr-x。这十个字符的字符串能让你了解谁对该文件有哪些操作权限。

第一个字符表示文件类型:

  • -:普通文件(如我们的 my_script.sh
  • d:目录
  • l:符号链接

接下来的九个字符分为三组,每组三个,分别代表以下对象的权限:

  1. 所有者:拥有该文件的用户(在本例中为 labex)。
  2. 所属组:拥有该文件的组(同样是 labex)。
  3. 其他用户:系统中的其他所有人。

在每组三个字符中,权限表示如下:

  • r:读取权限(允许查看文件内容)
  • w:写入权限(允许修改或删除文件)
  • x:执行权限(允许将文件作为程序运行)
  • -:表示未授予该权限

因此,对于 -rwxr-xr-x

  • 所有者(labex)拥有 rwx 权限:读取、写入和执行。
  • 所属组(labex)拥有 r-x 权限:读取和执行,但没有写入权限。
  • 其他用户拥有 r-x 权限:读取和执行,但没有写入权限。

此输出证实了在上一步使用 chmod +x 后,所有者(labex)现在对 my_script.sh 拥有执行权限(x)。

你还可以使用 ls -l 检查目录的权限。例如,让我们查看 ~/project 目录本身的权限:

ls -ld ~/project

-d 选项告诉 ls 列出目录本身,而不是其内容。输出可能如下所示:

drwxr-xr-x 2 labex labex 4096 <date> <time> /home/labex/project

这里,第一个字符 d 表示这是一个目录。权限 rwxr-xr-x 意味着:

  • 所有者(labex)对该目录拥有读取、写入和执行权限。对于目录,“执行”权限允许你进入该目录并访问其内容。
  • 所属组(labex)和其他用户对该目录拥有读取和执行权限,但没有写入权限。

理解 ls -l 的输出是在 Linux 中处理文件和权限的基础。

使用 stat 检查文件访问信息

在这一步中,你将使用 stat 命令来获取文件的详细信息,包括文件的访问时间、修改时间、更改时间,以及以比 ls -l 更结构化的格式显示的文件权限。

stat 命令用于显示文件状态。当你进行脚本编写或需要精确的时间戳时,这个命令特别有用。

让我们对前几步中创建的 my_script.sh 文件使用 stat 命令。确保你位于 ~/project 目录中,或者提供文件的完整路径。

stat ~/project/my_script.sh

你会看到类似以下的输出:

  File: /home/labex/project/my_script.sh
  Size: 30              Blocks: 8          IO Block: 4096   regular file
Device: <device_id>     Inode: <inode_number>  Links: 1
Access: (<permissions>/-rwxr-xr-x)  Uid: ( 5000/   labex)   Gid: ( 5000/   labex)
Access: <date> <time>.<nanoseconds> +<timezone_offset>
Modify: <date> <time>.<nanoseconds> +<timezone_offset>
Change: <date> <time>.<nanoseconds> +<timezone_offset>
 Birth: -

让我们来看看输出中的一些关键行:

  • File:文件的名称和路径。
  • Size:文件的大小(以字节为单位)。
  • Access: (<permissions>/-rwxr-xr-x):这一行同时以八进制格式(例如,0755 对应于 rwxr-xr-x)和你在 ls -l 中看到的符号格式显示文件权限。它还显示了文件所有者和所属组的用户 ID(Uid)和组 ID(Gid)。
  • Access:文件最后一次被访问(读取)的时间。
  • Modify:文件内容最后一次被修改的时间。
  • Change:文件元数据(如权限、所有者等)最后一次被更改的时间。
  • Birth:文件的创建时间(并非所有文件系统都支持显示此信息)。

ls -l 相比,stat 命令能提供更详细的文件信息。当你需要查看时间戳或权限的数字表示时,它特别有用。

你也可以对目录使用 stat 命令:

stat ~/project

输出会类似,但 File 类型会表明这是一个目录。

在你的 ~/project 目录中,对不同的文件和目录使用 stat 命令进行试验,观察输出的差异。

总结

在本次实验中,你学习了如何使用 test -x 命令来检查 Linux 系统中的文件是否可执行。你创建了一个简单的脚本文件,使用 test -x 命令并检查退出状态(echo $?),确认该文件最初处于不可执行状态(退出状态为 1)。然后,你使用 chmod +x 命令添加执行权限,并再次使用 test -xecho $? 验证更改,此时退出状态为 0。

你还探索了检查文件权限的其他方法。通过使用 ls -l 命令,你学会了解读权限字符串,特别是 'x' 字符,以此来识别可执行文件。最后,你使用 stat 命令查看文件的详细信息,包括访问权限,这为确认文件的可执行性提供了另一种方式。