在zsh中执行脚本-文件权限


16

我对执行文件权限不符合我的预期感到困惑。可能是因为我的期望是错误的。无论如何:

我有一个脚本文件,为了简单起见s,它位于中~/bin。对于此示例,文件仅包含以下几行:

#!/bin/zsh
echo "Test";

很简单的。

我导航到~/bin目录,并chmod具有sto 的文件权限400-即,仅对我只读。没有执行权限。因此,我尝试通过输入脚本路径来执行脚本,并给出以下内容:

% ./s
zsh: permission denied: ./s

到目前为止,一切都很好。由于权限错误,无法执行该文件。将权限提升到最高500(授予执行权限)也可以正常工作-使用这些权限,文件可以正常执行:

% ./s
Test

这完全符合预期。但是然后我将chmod权限放回至400(再次关闭执行权限),尝试source处理该文件,然后发生这种情况:

% source s
Test

虽然权限是 400,但脚本将执行。

所以这是我的问题:为什么会./s失败(应该如此),但是source s正常执行?这不会破坏执行权限的全部目的吗?

400权限下,sh s以及zsh s同时工作。

我确定我在做某事或在某处了解严​​重错误。可有人指出哪里给我,并解释之间的区别./ssource ssh szsh s

Answers:


17

运行时./s,您告诉内核执行程序s。如果您具有执行权限,则内核将读取文件的前几个字节,查看该#!行,以使其知道这是一个脚本,然后运行解释器,并将脚本名称作为第一个参数传递给它。如果您没有执行权限,则内核会在第一步中止执行。

运行时zsh s,将执行zsh,并告诉它读取称为的文件s并将其解释为命令。你没有执行s,你正在执行zsh。与sh s或相同cat s

source s再次运行时,您告诉zsh读取文件,因此重要的是您具有对该文件的读取权限。


好的,那很有道理。但是,这难道不会完全破坏拥有执行许可的意义吗?不管是否设置,我始终可以执行脚本(或告诉zsh解释脚本中的命令,这是等效的)。
C106 2012年

另外,cat s仅打印文件的内容。cat s | zsh将它们传递给zsh并打印Test
C106 2012年

1
@ C106执行权限的要点是表明该文件表示无需附加信息即可执行的操作。如果文件是setuid / setgid,这也很重要。文件可能没有执行权限,但仍然包含某些计算机程序在某处执行的指令。
吉尔(Gilles)'所以

这很有道理,实际上确实非常难以置信。谢谢。
C106 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.