如果我关闭了执行权限hello.sh
并尝试执行它
~$ sudo chmod 0666 hello.sh
~$ ./hello.sh
-bash: ./hello.sh: Permission denied
我收到权限错误。但我可以使用.
或source
内置函数轻松覆盖该错误。
$ . hello.sh
hello everyone
如果有人可以使用内置函数覆盖文件执行权限,那么设置文件的执行权限的目的是什么source
?
你好.sh
#!/bin/bash
echo 'hello everyone'
答案1
有一点不同:如果你像 一样执行脚本./script.sh
,则正在创建一个新进程,即 bash shell 的新实例。这是被拒绝的。
但是,由于权限允许您读脚本,有什么可以阻止您复制和粘贴所有内容?source
内置功能只会这样做:它通过从文本文件中读取命令来逐一执行命令。
答案2
当你跑步时./hello.sh
,你告诉核心执行程序hello.sh
。如果您有执行权限,则内核会读取文件的前几个字节,看到 #! 行,因此它知道这是一个脚本,并运行解释器 ( /bin/bash
),将脚本名称作为其第一个参数传递给它。然后 bash 将文件视为一系列指令。如果您没有执行权限,则内核会在第一步中止执行。
当你运行. hello.sh
或 时source hello.sh
,你并不是在要求内核执行hello.sh
。而是在要求 bash 读取文件hello.sh
并将其解释为一系列指令。
顺便说一句,如果你运行 ,情况也是一样bash hello.sh
:你不是在执行hello.sh
,而是在让 bash 解释它(正在执行)。参见在 zsh 中执行脚本-文件权限。