./script.sh与sh script.sh的执行差异及无执行权限仍可通过sh执行的原因
为什么
sh script.sh能正常运行,./script.sh却提示权限拒绝? 咱们先把这两种执行方式的底层逻辑掰扯清楚,你就能瞬间明白差异所在了:
1. sh script.sh的执行逻辑
当你敲这个命令时,本质是直接调用sh这个Shell解释器程序,把script.sh当作一个“输入文件”参数传给它。这时候,真正在执行的是sh程序(它本身肯定有可执行权限),而你的脚本只需要有读权限就行——毕竟解释器只是要读取脚本里的内容来执行。你的脚本默认权限是-rw-r--r--,刚好满足读权限要求,所以自然能正常运行。
2. ./script.sh的执行逻辑
这个命令是让系统把脚本本身当作可执行程序来启动。这时候系统会做两件事:
- 首先检查脚本文件是否拥有可执行权限(x权限),你的脚本默认没有这个权限,所以直接触发
Permission denied; - 就算给了可执行权限,系统还会看脚本开头的
#!/bin/sh(也就是shebang行),用它指定的解释器来运行脚本内容。
实际执行示例
[root@ip safe]# sh test.sh test [root@ip safe]# ./test.sh -bash: ./test.sh: Permission denied
简单总结一下:
sh script.sh靠的是解释器的执行权限,脚本只要能读就行;./script.sh要求脚本自己必须有可执行权限,否则系统不让你直接启动它。
内容的提问来源于stack exchange,提问作者Sandeep Chaurasiya




