如何在 Linux 中运行 .sh 文件:初学者和系统管理员完整指南
Shell 脚本是 Linux 自动化的支柱。无论您是在部署 Web 应用程序、计划备份还是配置新配置的服务器,.sh 文件都可以让您将复杂的命令序列捆绑到单个可重复执行的文件中。本指南将带您了解在 Linux 中运行 shell 脚本的所有方法 — 从基本执行到后台进程和 cron 调度 — 以及在生产环境中适用的最佳实践。
什么是 Linux 中的 .sh 文件?
.sh 文件是用 shell 语言(通常是 Bash 或 POSIX sh)编写的纯文本脚本,由 Linux shell 逐行解释和执行。Shell 脚本用于:
- 自动化重复的系统管理任务
- 部署和配置应用程序
- 管理用户、权限和文件系统
- 计划维护工作,如备份和日志轮转
- 在配置后引导新服务器
如果您正在管理 VPS 托管环境或专用服务器,shell 脚本编写是一项不可或缺的技能,每周可以为您节省数小时的手动工作。
前置条件
在运行任何 .sh 文件之前,请确保您有:
- 访问 Linux 终端(本地或通过 SSH)
- 具有适当权限的用户账户
- 脚本文件已在系统上(在本地创建或通过 SCP/SFTP 传输)
方法 1:使用 chmod 使文件可执行
默认情况下,新创建或下载的 .sh 文件没有执行权限。在将脚本作为程序运行之前,您必须使用 chmod 命令显式授予执行权限。
chmod +x script.sh要验证权限是否正确应用:
ls -l script.sh您应该看到类似的输出:
-rwxr-xr-x 1 user user 1024 Jun 10 14:32 script.shx 标志确认该文件现在可由所有者、组和其他人执行。
> 安全提示:如果您想将执行权限限制为仅文件所有者,请使用 chmod 700 script.sh 而不是 chmod +x。
方法 2:使用相对路径或绝对路径运行脚本
文件可执行后,您可以从终端直接运行它。
使用相对路径(当前目录)
如果脚本在您的当前工作目录中,请在其前面加上 ./:
./script.sh./ 告诉 shell 在当前目录中查找,而不是搜索系统 $PATH。
使用绝对路径
如果脚本存储在另一个位置,请提供其完整路径:
/home/user/scripts/script.sh或
/usr/local/bin/script.sh在从 cron 作业或其他自动化上下文运行脚本时,使用绝对路径特别重要,因为工作目录可能不同。
方法 3:使用 bash 或 sh 运行脚本(不需要执行权限)
您可以通过显式调用解释器来调用 shell 脚本,即使文件缺少执行权限。这对于在使脚本永久可执行之前快速测试脚本特别有用。
bash script.sh或者,对于 POSIX 兼容脚本:
sh script.shbash 和 sh 之间的区别
| 命令 | 解释器 | 支持 Bash 特定功能 |
|---|---|---|
bash script.sh | GNU Bash | 是 |
sh script.sh | POSIX sh(Ubuntu 上通常是 dash) | 否 |
如果您的脚本使用 Bash 特定的语法,如数组、[[ ]] 条件或进程替换,请始终使用 bash 而不是 sh。
方法 4:以超级用户身份运行脚本 (sudo)
某些脚本需要根级权限来修改系统文件、管理服务、安装软件包或更改网络配置。使用 sudo 来提升权限:
sudo ./script.sh或使用提升的权限将脚本直接传递给 bash:
sudo bash script.sh重要的安全考虑
- 永远不要在没有先阅读脚本的情况下以 root 身份运行脚本。具有 sudo 访问权限的恶意或编写不当的脚本可能会导致不可逆转的系统损坏。
- 优先使用最少所需权限运行脚本。
- 如果脚本只需要写入特定目录,请考虑调整目录权限,而不是以 root 身份运行整个脚本。
方法 5:在后台运行脚本
默认情况下,在终端中运行脚本会阻止您的会话,直到脚本完成。对于长时间运行的任务 — 如大型文件传输、数据库迁移或服务器构建 — 您需要将进程发送到后台。
使用 & 运算符
./script.sh && 符号将进程分叉到后台,并立即将控制权返回到您的终端。shell 打印后台作业的 PID(进程 ID),您可以稍后使用它来监控或终止它。
使用 nohup 在注销后保持脚本运行
如果您断开 SSH 连接,使用 & 启动的后台作业通常会终止。使用 nohup 来防止这种情况:
nohup ./script.sh &输出默认重定向到 nohup.out。要指定自定义日志文件:
nohup ./script.sh > /var/log/myscript.log 2>&1 &监控后台作业
jobs # List background jobs in the current session
ps aux | grep script.sh # Find the process by name
kill PID # Terminate a specific background process方法 6:使用 Cron 计划脚本执行
对于重复任务 — 夜间备份、每周清理、每小时健康检查 — Linux 的内置 cron 调度程序是标准解决方案。
打开 Crontab 编辑器
crontab -eCron 语法
* * * * * /path/to/script.sh
│ │ │ │ │
│ │ │ │ └── Day of week (0–7, Sunday = 0 or 7)
│ │ │ └──── Month (1–12)
│ │ └────── Day of month (1–31)
│ └──────── Hour (0–23)
└────────── Minute (0–59)实用的 Cron 示例
| 计划 | Cron 表达式 | 示例用例 |
|---|---|---|
| 每天凌晨 2:00 | 0 2 * * * | 夜间数据库备份 |
| 每周一早上 6:00 | 0 6 * * 1 | 每周日志轮转 |
| 每小时 | 0 * * * * | 正常运行时间监控检查 |
| 每 15 分钟 | */15 * * * * | 缓存刷新 |
| 系统重启时 | @reboot | 在启动时启动服务或脚本 |
示例:自动化日常备份
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1这会每天凌晨 2:00 运行 backup.sh,并将标准输出和错误都附加到日志文件以供审计。
> 专业提示:在 cron 条目中始终使用绝对路径。Cron 运行时环境最少,可能无法访问与交互式 shell 相同的 $PATH。
方法 7:源脚本(在当前 Shell 上下文中运行)
还有一种值得了解的执行方法:源脚本。与上述方法不同,源脚本在当前 shell 会话中运行脚本,而不是生成子 shell。这意味着脚本中定义的任何变量或函数都会保留在您的当前环境中。
source script.sh或等效地:
. script.sh这通常用于加载环境变量、激活虚拟环境或将配置更改应用到当前会话。
故障排除常见错误
| 错误消息 | 可能原因 | 解决方案 |
|---|---|---|
Permission denied | 文件缺少执行权限 | 运行 chmod +x script.sh |
No such file or directory | 路径错误或文件丢失 | 使用 ls 和 pwd 验证路径 |
bad interpreter: No such file or directory | 错误的 shebang 行(例如 Windows 行尾) | 运行 dos2unix script.sh 来修复行尾 |
command not found | 脚本不在 $PATH 中且没有 ./ 前缀 | 使用 ./script.sh 或完整绝对路径 |
syntax error near unexpected token | 脚本为 bash 编写但用 sh 运行 | 显式使用 bash script.sh |
编写和运行 Shell 脚本的最佳实践
遵循这些实践将使您的脚本更安全、更易维护、更易调试 — 特别是在服务器环境中。
1. 始终以 Shebang 行开头
每个脚本的第一行应声明解释器:
#!/bin/bash或为了最大的可移植性:
#!/usr/bin/env bash2. 启用严格模式
在每个生产脚本的顶部附近添加:
set -euo pipefail-e— 如果任何命令失败,立即退出-u— 将未设置的变量视为错误-o pipefail— 捕获管道命令中的失败
3. 在运行脚本前阅读它
永远不要执行来自外部或不受信任来源的 .sh 文件,除非先查看其内容:
cat script.sh或在文本编辑器中打开它。当使用 sudo 运行时,这特别重要。
4. 大量使用注释
#!/bin/bash
# backup.sh — Daily backup script for /var/www
# Author: sysadmin@example.com
# Last updated: 2024-06-10
# Define source and destination directories
SOURCE="/var/www"
DEST="/mnt/backup"5. 在专用目录中组织脚本
| 目录 | 推荐用途 |
|---|---|
/usr/local/bin/ | 所有用户可访问的系统范围脚本 |
~/scripts/ 或 ~/bin/ | 个人用户脚本 |
/opt/scripts/ | 特定于应用程序的自动化脚本 |
/etc/cron.daily/ | 通过 cron 每天运行的脚本 |
6. 记录脚本输出
对于无人值守运行的脚本,始终将输出重定向到日志文件:
./script.sh >> /var/log/script.log 2>&17. 首先在安全环境中测试脚本
在将脚本部署到生产服务器之前,请在暂存环境或一次性 VPS 实例上测试它,以免错误导致停机。
在 Linux 服务器上运行 Shell 脚本:实际考虑
在远程 Linux 服务器上运行脚本时 — 无论是在共享环境还是专用机器上 — 需要考虑几个额外的因素:
- SSH 访问:大多数服务器端脚本编写都通过 SSH 进行。
screen或tmux等工具可让您维护持久会话,以便长时间运行的脚本在断开连接后继续存在。 - 用户权限:在共享
