Linux Shell中无执行权限脚本为何可通过source命令正常运行?
Shell脚本两种执行方式的权限差异底层原因
两种运行模式的底层逻辑完全不同,对应权限要求也存在本质区别:
该方式属于外置独立程序执行,操作系统会创建全新的子进程,调用./helloworld.sh执行模式exec系统调用尝试运行该脚本文件。exec系统调用的强制要求是目标文件必须开启执行权限(x位),你当前的文件权限为-rw-rw-r--,三类用户(所有者、同组用户、其他用户)均未分配x权限,因此会被系统直接拦截报错。
该模式下会读取脚本首行的shebang(如#!/bin/bash)指定的解释器运行,脚本内的环境变量变更不会影响父Shell的运行环境。
这里的. helloworld.sh执行模式.是Shell内置source命令的简写,本质是当前Shell进程直接读取文件内容逐行解析执行,不会创建新子进程,也不会调用exec系统调用。该模式仅要求当前操作用户对脚本拥有*可读权限(r位)*即可,不需要执行权限,你当前的权限配置完全满足读权限要求,因此可以正常运行。
该模式下不会读取shebang指定的解释器,直接用当前Shell解析执行,脚本内的环境变量变更会直接修改当前Shell的运行环境。
内容的提问来源于stack exchange,提问作者Harseo
相关产品推荐
相关产品推荐

