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

C10*_*106 16 shell permissions zsh executable shell-script

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

我有一个脚本文件,为简单起见,仅称为s,位于~/bin. 就本示例而言,该文件仅包含以下几行:

#!/bin/zsh
echo "Test";
Run Code Online (Sandbox Code Playgroud)

很简单。

我浏览到~/bin目录,chmod的文件权限s400-即只读我只。没有执行权限。然后我尝试通过输入其路径来执行脚本,给出:

% ./s
zsh: permission denied: ./s
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。由于权限错误,该文件无法执行。将权限提升到500(授予执行权限)也可以正常工作 - 使用这些权限,文件可以正常执行:

% ./s
Test
Run Code Online (Sandbox Code Playgroud)

这一切都在预料之中。但是然后我的chmod权限回落到400(再次执行权限关闭),尝试sourceing 文件,这发生了:

% source s
Test
Run Code Online (Sandbox Code Playgroud)

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

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

400权限,sh szsh s同时工作。

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

Gil*_*il' 18

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

运行时zsh s,您执行zsh,并告诉它读取调用的文件s并将其解释为命令。你不是在执行s,你是在执行zsh。与sh sor相同cat s

当你source s再次运行时,你告诉 zsh 读取一个文件,所以重要的是你有读取它的权限。