C10*_*106 16 shell permissions zsh executable shell-script
我对执行文件权限的行为不符合我的预期感到困惑。可能是因为我的期望是错误的。反正:
我有一个脚本文件,为简单起见,仅称为s,位于~/bin. 就本示例而言,该文件仅包含以下几行:
#!/bin/zsh
echo "Test";
Run Code Online (Sandbox Code Playgroud)
很简单。
我浏览到~/bin目录,chmod的文件权限s来400-即只读我只。没有执行权限。然后我尝试通过输入其路径来执行脚本,给出:
% ./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 s并zsh s同时工作。
我确定我正在做或理解某处可怕的错误。可有人指出哪里给我,并解释之间的区别./s,source s,sh s和zsh s?
Gil*_*il' 18
当您运行时./s,您告诉内核执行该程序s。如果您有执行权限,那么内核会读取文件的前几个字节,查看该#!行以便知道这是一个脚本,然后运行解释器,将脚本名称作为第一个参数传递给它。如果您没有执行权限,内核会在第一步中止执行。
运行时zsh s,您执行zsh,并告诉它读取调用的文件s并将其解释为命令。你不是在执行s,你是在执行zsh。与sh sor相同cat s。
当你source s再次运行时,你告诉 zsh 读取一个文件,所以重要的是你有读取它的权限。
| 归档时间: |
|
| 查看次数: |
61180 次 |
| 最近记录: |