在Linux系统中,Shell脚本(通常以.sh为扩展名)是自动化任务、管理系统和简化操作的重要工具,运行Shell脚本是Linux日常运维和开发的基础技能,本文将详细介绍Linux运行sh程序的完整流程、方法及注意事项。

Shell脚本的基础结构
在运行脚本前,需先了解其基本结构,一个典型的Shell脚本通常包含shebang行(解释器指令)和主体代码两部分,一个简单的Hello World脚本如下:
#!/bin/bash # shebang行,指定解释器为Bash echo "Hello, Linux!" # 主体代码,输出文本
- shebang行:以开头,后跟解释器路径(如
/bin/bash),作用是告诉系统使用哪个程序来执行脚本,若省略,系统默认使用/bin/sh解释,可能导致语法不兼容(因Bash和sh的语法存在差异)。 - 主体代码:包含Shell命令、变量、条件判断、循环等逻辑,用于实现具体功能。
运行Shell脚本的准备工作
创建并编写脚本
使用文本编辑器(如vi、nano或gedit)创建脚本文件,例如创建test.sh:
vi test.sh # 进入编辑器,输入上述Hello World脚本,保存退出
设置脚本执行权限
Linux系统基于权限控制文件访问,默认情况下,新创建的脚本无执行权限,需通过chmod命令添加:
chmod +x test.sh # 添加执行权限(x表示execute)
权限说明:
+x:为文件所有者、所属组及其他用户添加执行权限;- 也可使用
chmod 755 test.sh设置权限(所有者可读/写/执行,所属组和其他用户可读/执行)。
若忘记设置权限,直接运行时会报错Permission denied。
运行Shell脚本的常见方法
运行Shell脚本主要有以下4种方式,每种方式的特点和适用场景不同,具体对比如下表:
| 运行方式 | 命令示例 | 是否需要执行权限 | 是否创建新进程 | 适用场景 |
|---|---|---|---|---|
| 直接执行(相对路径) | ./test.sh |
是 | 是(子Shell) | 正式运行脚本,保持独立环境 |
| 直接执行(绝对路径) | /home/user/test.sh |
是 | 是(子Shell) | 路径明确,避免当前目录干扰 |
| 通过解释器运行 | bash test.sh |
否 | 是(子Shell) | 临时运行,无需修改权限 |
| Source/点命令运行 | source test.sh 或 . test.sh |
否 | 否(当前Shell) | 需要在当前Shell环境生效(如修改变量) |
直接执行(需执行权限)
通过(当前目录)或绝对路径运行,这是最常用的方式:

./test.sh # 相对路径(需在脚本所在目录执行) /home/user/test.sh # 绝对路径(任何目录均可执行)
特点:
- 系统会根据shebang行指定的解释器(如
/bin/bash)运行脚本; - 脚本在子Shell中执行,脚本内的变量、函数等不会影响当前Shell环境(如脚本中定义
a=1,执行后当前Shell中echo $a仍为空)。
通过解释器运行(无需执行权限)
直接使用bash(或sh)命令解释脚本,无需设置执行权限:
bash test.sh # 使用Bash解释器 sh test.sh # 使用sh解释器(兼容性更强,但可能不支持Bash扩展语法)
特点:
- 适合临时测试或快速运行脚本,无需修改权限;
- 同样在子Shell中执行,不影响当前Shell环境;
- 若脚本shebang行指定的解释器不存在(如
#!/bin/bash但系统未安装Bash),可通过此方式强制运行。
Source/点命令运行(当前Shell环境)
使用source或点命令(注意和表示当前目录区分)运行脚本,脚本内容在当前Shell中执行:
source test.sh # 或 . test.sh(注意点和脚本名需有空格)
特点:
- 脚本内的变量、函数、环境变量等会直接作用于当前Shell;
- 适用于需要“临时加载”配置或函数的场景(如加载环境变量文件
/etc/profile或自定义脚本)。
示例:
若脚本test.sh内容为export MY_VAR="hello",执行source test.sh后,当前Shell中可直接使用echo $MY_VAR输出hello;而用./test.sh执行则无法获取该变量。
常见问题与调试
报错“Permission denied”
原因:脚本未设置执行权限。
解决:运行chmod +x script.sh添加权限。

报错“bad interpreter: No such file or directory”
原因:shebang行指定的解释器路径错误(如#!/bin/bash但实际Bash路径为/usr/bin/bash)。
解决:
- 使用
which bash查看Bash实际路径,修改shebang行; - 或直接通过解释器运行(如
bash script.sh)。
脚本语法错误或逻辑问题
调试方法:
- 使用
bash -x script.sh运行脚本,会打印每条命令的执行结果,方便定位错误; - 或在脚本开头添加
set -x(开启调试模式),结尾添加set +x关闭调试模式。
相关问答FAQs
Q1:为什么用执行脚本时提示“command not found”?
A:Linux的PATH环境变量只包含系统命令的目录(如/bin、/usr/bin),而当前目录()默认不在PATH中,直接输入test.sh时,系统会在PATH目录中查找该命令,找不到则报错,解决方案:
- 使用
./test.sh明确指定当前目录; - 或将脚本复制到
PATH中的目录(如/usr/local/bin); - 或将当前目录添加到
PATH(如export PATH=$PATH:.,但存在安全风险,不推荐)。
Q2:source和执行脚本时,变量作用域有何区别?
A:核心区别在于是否创建新Shell进程:
./test.sh:在子Shell中执行,脚本内的变量、函数等仅在子Shell中有效,脚本执行结束后,当前Shell的环境不会改变;source test.sh:在当前Shell中执行,脚本内的变量、函数会直接作用于当前Shell,执行后仍可访问(如脚本中定义的变量、修改的环境变量等)。
示例:
脚本var_test.sh内容:#!/bin/bash; MY_VAR="script_value"。
- 执行
./var_test.sh后,echo $MY_VAR输出空(当前Shell未获取变量); - 执行
source var_test.sh后,echo $MY_VAR输出script_value(变量已注入当前Shell)。
通过以上方法,可灵活运行Linux Shell脚本,并根据场景选择合适的执行方式,掌握这些基础操作,能有效提升自动化任务的管理效率。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/38228.html