介绍
在这个实验中,你将学习如何使用多种方法来判断 Linux 系统中的文件是否可执行。首先,你会使用带有 -x 选项的 test 命令来检查文件的可执行权限,并了解如何解读其退出状态。
接下来,你将探索如何使用 ls -l 命令查看文件的详细权限信息,并识别可执行标志。最后,你将学习如何使用 stat 命令检查文件的访问信息,这为确认文件是否可执行提供了另一种方法。
使用 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:符号链接
接下来的九个字符分为三组,每组三个,分别代表以下对象的权限:
- 所有者:拥有该文件的用户(在本例中为
labex)。 - 所属组:拥有该文件的组(同样是
labex)。 - 其他用户:系统中的其他所有人。
在每组三个字符中,权限表示如下:
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 -x 和 echo $? 验证更改,此时退出状态为 0。
你还探索了检查文件权限的其他方法。通过使用 ls -l 命令,你学会了解读权限字符串,特别是 'x' 字符,以此来识别可执行文件。最后,你使用 stat 命令查看文件的详细信息,包括访问权限,这为确认文件的可执行性提供了另一种方式。



