为何用sh执行脚本时Shebang被忽略?文件读取失败排查
问题原因解析
1. Shebang被忽略的直接原因
当你主动用sh 脚本名的方式执行脚本时,系统会直接使用你指定的sh作为解释器,完全跳过脚本开头的Shebang行。只有当你直接执行脚本文件(比如./script.sh,且脚本已添加可执行权限)时,系统才会读取Shebang行,根据指定的路径调用对应的解释器(比如bash)。
2. $SHELL显示/bin/bash的误区
$SHELL是记录用户默认登录shell的环境变量,和当前运行脚本的shell进程无关。只要你的系统默认shell配置为bash,哪怕用sh、zsh等其他shell执行脚本,$SHELL都会输出/bin/bash,这并不代表当前脚本是用bash在运行。
3. 无法读取文件的核心问题
多数系统里的sh是POSIX标准的轻量shell(比如Debian/Ubuntu系中sh是dash的软链接),它不支持bash特有的语法特性。如果你的脚本用了bash专属的文件读取写法(比如content=$(<file.txt)),用sh执行时会因为语法不兼容报错,导致读取失败。换成POSIX兼容的写法(比如content=$(cat file.txt)),sh就能正常处理。
4. ps显示sh运行的逻辑
因为你明确指定了用sh来执行脚本,所以进程列表里显示的就是sh进程,这和脚本内的Shebang没有关联——Shebang仅在直接执行脚本文件时才会生效。
内容的提问来源于stack exchange,提问作者MoRe
相关产品推荐
相关产品推荐

