You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

./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

火山引擎 最新活动