当我运行时,有许多文件显示为绿色ls
。我知道这些是可执行文件,并且我知道可以使用chmod
.但它们是.csv
文件.pdf
。我不明白如何“执行”逗号分隔的文本文件或 PDF。所以:
- 它们如何真正“可执行”?
- 我将如何执行它们?
- 当我这样做时会发生什么?
答案1
这只是一个问题权限。如果文件具有执行权限,则意味着用户允许来执行它。他们是否会成功是另一回事。为了执行文件,执行该文件的用户必须有权执行此操作和该文件必须是有效的可执行文件。显示的权限ls
仅影响第一部分权限,与其余部分无关。
例如:
$ cat file.csv
a,silly,file
$ chmod a+x file.csv
$ ls -l file.csv
-rwxr-xr-x 1 terdon terdon 13 May 29 15:22 file.csv
x
该文件现在具有执行权限(请参阅权限字符串中的3 -rwxr-xr-x
)。但如果我尝试执行它,我会收到错误:
$ ./file.csv
./file.csv: line 1: a,silly,file: command not found
这是因为 shell 尝试将文件作为 shell 脚本执行,并且其中没有有效的 shell 命令,因此失败。
答案2
你的绿色ls
表示文件已执行权限,这并不一定意味着它们可以被处决以任何方式。
如果您不小心设置了执行权限,或者由于从不支持基本 Linux 权限模型的文件系统导入而设置了执行权限,则可以使用以下命令删除执行位
chmod a-x -- "$filename"
该文件将不再显示为“可执行文件”。
请注意文件列表中的其他颜色可能根据文件扩展名设置;但在这种情况下,它可能只是权限位。
答案3
公认的答案延续了神话,并且对 Unix 中如何“执行”文件的理解很差。
./cmd
shell 中的功能不仅仅是尝试执行./cmd
:如果执行./cmd
失败ENOEXEC
(就像任何无效的可执行文件一样)二进制或者不以 a 开头舍邦,包括有效的 shell 脚本),那么 shell 将A。读取文件并将其自身解释为 shell 脚本或b.执行/bin/sh
或另一个 shell 并将其./cmd
作为第一个参数传递。
shebang 机制 ( #! /path/to/interpreter
) 虽然被大多数 Unix 系统实现,但并不是标准的。此外,许多系统(例如 Linux)还能够以其他“神奇”序列(甚至基于文件扩展名,类似 MSDOS)开始“执行”文件。
例如,您可以通过以下方式在 Linux 上拥有“可执行”pdf 文件binfmt_misc:
$ chmod +x 2503.pdf
$ ./2503.pdf
./2503.pdf: line 1: fg: no job control
./2503.pdf: line 1051: warning: here-document at line 2 delimited by end-of-file (wanted `/Linearized')
[... a lot of crazy errors in the same vein ...]
$ su -c 'echo :pdf-zathura:M::%PDF-1.::/usr/bin/zathura: > /proc/sys/fs/binfmt_misc/register'
$ ./2503.pdf
[start zathura and display the pdf file]