项目场景:
项目场景:./xxx.sh
和 sh xxx.sh
的区别)
首先编辑一个.sh文件
对文件增加执行权限:
分别使用两种方式执行:
没什么疑问,都可以执行。将文件的执行权限去掉再执行,这时,问题就来了!
使用sh hello.sh
可以运行,但是./hello.sh
却不可以。可是他们两个不都是使用bash解释器来执行吗?为什么一种方式可以,另一种却不可以呢?
这里补充解释一下sh命令使用的是什么shell解释器
sh xxx.sh 使用的是shell解释器,这里的shell解释器可是bash解释器、dash解释器、z解释器等shell解释器,随便哪一个都可以,一般默认是bash默认解释器。
而使用bash xxx.sh 即使明确使用bash解释器
当你运行 sh hello.sh 命令时,它实际上不是在直接执行 hello.sh 脚本文件,而是通过调用 /bin/sh 这个解释器来解释执行脚本内容。这种方式绕过了脚本文件的执行权限检查。
多方所搜,将自己对这个问题的解释如下:
执行 sh hello.sh 时,Shell 解释器 /bin/sh 会打开 hello.sh 文件,并逐行解释执行其中的命令。因为你是通过 /bin/sh 解释器来运行脚本的,而不是直接执行脚本文件,所以并不需要 hello.sh 文件本身具有执行权限。
这种方法的好处是,即使 hello.sh 文件没有执行权限,你仍然可以通过指定一个合法的解释器路径(如 /bin/sh)来执行脚本。这种方式对于一些临时性的脚本或者不希望直接给予执行权限的脚本来说很有用。