在Linux系统中,.sh文件是Shell脚本文件,通常包含一系列命令,用于自动化任务、批量处理系统操作或执行复杂逻辑,要让.sh脚本成功执行,需经过权限设置、执行方式选择等步骤,本文将详细说明具体操作、方法区别及常见问题处理。

执行.sh脚本前的核心准备:文件权限
Linux系统通过文件权限控制用户对文件的访问,执行脚本的前提是脚本文件具有“可执行”权限,默认情况下,新创建的.sh文件只有读写权限(rw-r–r–),用户需手动添加执行权限。
使用chmod命令添加执行权限
chmod(change mode)用于修改文件权限,可通过符号法或数字法设置:
- 符号法:
+x表示添加执行权限(execute),u+x表示仅对文件所有者添加,g+x对用户组添加,o+x对其他用户添加。
示例:chmod +x script.sh # 为所有用户添加执行权限 chmod u+x script.sh # 仅所有者可执行
- 数字法:Linux权限用3位八进制数表示,分别对应所有者(u)、用户组(g)、其他用户(o)的权限,4=读(r)、2=写(w)、1=执行(x),7=r+w+x,5=r+x,4=r,0=无权限。
示例:chmod 755 script.sh # 所有者rwx(7),用户组和其他用户r-x(5) chmod 700 script.sh # 仅所有者可执行(rwx),其他人无权限
验证权限设置
执行ls -l script.sh查看文件权限,若输出中有x(如-rwxr-xr-x),则表示权限设置成功。
.sh脚本的四种主要执行方法
设置权限后,可通过以下方式执行脚本,不同方法的执行逻辑和适用场景存在差异。
方法一:直接执行(需可执行权限)
通过绝对路径或相对路径直接调用脚本,这是最常用的方式,要求脚本第一行有shebang(解释器指令),明确告诉系统用哪个Shell解释器执行脚本。

- 操作命令:
./script.sh # 相对路径(当前目录下) /path/to/script.sh # 绝对路径(如/home/user/script.sh)
- 关键前提:
- 脚本具有可执行权限(
chmod +x); - 脚本第一行需包含
shebang,例如#!/bin/bash(使用Bash解释器)、#!/bin/sh(使用默认Shell),若缺少shebang,系统会默认使用当前Shell解释,可能导致语法错误。
- 脚本具有可执行权限(
- 执行逻辑:
系统会启动一个新的子Shell进程,在子Shell中逐行执行脚本命令,执行结束后返回父Shell,脚本中的变量(如自定义变量)仅在子Shell中有效,不会影响父Shell环境。
方法二:通过Shell解释器执行(无需可执行权限)
若脚本未设置可执行权限,或需指定特定Shell解释器(如用bash而非sh),可通过bash或sh命令直接解释执行脚本内容。
- 操作命令:
bash script.sh # 使用Bash解释器执行 sh script.sh # 使用默认Shell(可能是sh、dash等)执行 /bin/bash script.sh # 指定Bash解释器的绝对路径
- 特点:
- 不依赖脚本的可执行权限,只需用户对脚本文件有读取权限;
- 即使脚本缺少
shebang,也能通过指定的解释器执行; - 同样会启动子Shell进程,脚本变量不影响父Shell。
方法三:使用source或点命令执行(在当前Shell中执行)
若需让脚本在当前Shell环境中执行(脚本中的变量、函数会影响当前Shell),需使用source命令或点号(注意点号与脚本名需有空格)。
- 操作命令:
source script.sh # 推荐方式,可读性强 . script.sh # 功能与source相同,点号是source的别名
- 关键逻辑:
source命令不会启动新Shell,而是在当前Shell中读取并执行脚本内容,脚本中定义的变量(如export VAR="value")、函数会直接作用于当前Shell环境,执行后可通过echo $VAR查看变量值。 - 适用场景:
需要修改当前Shell环境变量(如配置PATH、加载函数库)时,必须使用source或命令。
方法四:通过sh -x或bash -x调试执行
若脚本执行失败或需排查逻辑问题,可通过-x参数开启调试模式,逐行显示脚本执行过程,方便定位错误。
- 操作命令:
bash -x script.sh # 显示执行的命令及输出结果 sh -x script.sh # 使用sh解释器调试
- 调试输出示例:
执行脚本时,会先输出开头的命令,+ echo "Hello, World!" Hello, World! + VAR="test" + echo $VAR test
四种执行方式的对比总结
为更直观理解不同方法的区别,可通过下表对比:
| 执行方式 | 命令示例 | 是否需可执行权限 | 是否开启新Shell进程 | 适用场景 |
|---|---|---|---|---|
| 直接执行 | ./script.sh |
是 | 是(子Shell) | 常规脚本执行,自动化任务 |
| Shell解释器执行 | bash script.sh |
否 | 是(子Shell) | 指定解释器、无执行权限时 |
| source/点命令执行 | source script.sh |
否 | 否(当前Shell) | 修改环境变量、加载配置文件 |
| 调试执行 | bash -x script.sh |
否 | 是(子Shell) | 脚本调试、排查逻辑错误 |
常见错误及解决方法
执行.sh脚本时,可能会遇到以下问题,按以下步骤排查:

错误:Permission denied(权限不足)
- 原因:脚本未设置可执行权限,或当前用户对脚本文件无执行权限。
- 解决:使用
chmod +x script.sh添加权限,或通过bash script.sh用解释器执行(无需权限)。
错误:No such file or directory(文件不存在或路径错误)
- 原因:输入的脚本路径错误(如当前目录下未用),或脚本被移动/删除。
- 解决:确认脚本路径,使用
ls命令检查文件是否存在,或用绝对路径(如/home/user/script.sh)。
错误:bad interpreter: No such file or directory(解释器路径错误)
- 原因:脚本
shebang行指定的解释器路径错误(如#!/bin/bash但系统中无bash,或路径应为#!/usr/bin/bash)。 - 解决:
- 使用
which bash查看bash的实际路径(如/usr/bin/bash),修改shebang行; - 若系统未安装对应解释器(如需
bash但仅有sh),可通过sudo apt install bash(Ubuntu/Debian)或sudo yum install bash(CentOS/RHEL)安装。
- 使用
错误:脚本中命令未执行或语法错误
- 原因:脚本语法错误(如未使用反引号、变量未定义)、Shell解释器不兼容(如Bash语法在sh中执行失败)。
- 解决:
- 用
bash -x script.sh调试,查看具体报错行; - 检查脚本语法,确保与
shebang指定的解释器兼容(如Bash的[[]]语法在sh中不支持,需改用[])。
- 用
相关问答FAQs
问题1:为什么给.sh脚本赋予权限后,直接输入script.sh无法执行,必须用./script.sh?
解答:Linux系统的PATH环境变量包含可执行文件的搜索路径(如/bin、/usr/bin),但当前目录()默认不在PATH中,为避免安全风险(如当前目录下的恶意脚本覆盖系统命令),需通过明确指定“当前目录下的文件”,或使用绝对路径,若希望直接输入script.sh执行,可将脚本移动到PATH包含的目录(如/usr/local/bin),或通过export PATH=$PATH:.将当前目录加入PATH(不推荐,存在安全风险)。
问题2:执行.sh脚本时提示“ command not found”,但命令手动输入可执行,如何解决?”
解答:通常由以下原因导致:
- 脚本换行符问题:Windows系统创建的脚本可能使用
rn作为换行符,而Linux系统需n,导致Shell将r识别为命令字符,可通过dos2unix script.sh转换换行符,或用sed -i 's/r$//' script.sh删除r; - 变量未定义或引号使用错误:如未给变量加引号(
VAR=value而非VAR="value"),或变量中包含空格但未用引号包裹(如echo $VAR改为echo "$VAR"); - 命令路径未指定:脚本中使用的命令未在
PATH中(如systemctl在Ubuntu中需/bin/systemctl),可通过which 命令查看实际路径,或使用绝对路径执行命令。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/30244.html