如何在 Linux 中运行 .sh 文件:初学者和系统管理员完整指南
Shell 脚本是 Linux 自动化的基础。无论您是在部署 Web 应用程序、计划备份还是配置新配置的服务器,.sh 文件都可以让您将复杂的命令序列捆绑到单个可重复执行的文件中。本指南将带您了解在 Linux 中运行 shell 脚本的每种方法——从基本执行到后台进程和 cron 调度——以及在生产环境中适用的最佳实践。
什么是 Linux 中的 .sh 文件?
A .sh 文件是用 shell 语言(通常是 Bash 或 POSIX sh)编写的纯文本脚本,Linux shell 逐行解释和执行。Shell 脚本用于:
- 自动化重复的系统管理任务
- 部署和配置应用程序
- 管理用户、权限和文件系统
- 安排维护工作,如备份和日志轮转
- 在配置后引导新服务器
如果您正在管理 VPS Hosting 环境或 Dedicated Server,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:Source 脚本(在当前 Shell 上下文中运行)
还有一种执行方法值得了解:sourcing 脚本。与上述方法不同,sourcing 在当前 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等工具让你可以维护持久会话,以便长时间运行的脚本在断开连接后仍能继续执行。 - 用户权限:在共享托管环境中,你执行脚本的能力可能受到限制。具有 cPanel 的 VPS 可以为你提供完整的 root 访问权限和对脚本执行的完全控制。
- 自动化部署:将 shell 脚本与 cron 任务结合,以自动化部署、证书续期(特别是与 SSL 证书一起使用时很有用)和日常维护任务。
- 环境变量:通过 cron 或 SSH 运行的脚本可能不会继承你的交互式 shell 的环境。在脚本中显式定义所有必要的变量或引用配置文件。
快速参考:一览所有方法
| 方法 | 命令 | 用例 |
|---|---|---|
| 使用权限执行 | chmod +x script.sh && ./script.sh | 标准执行 |
| 使用 bash 运行 | bash script.sh | 不需要执行权限 |
| 使用 sh 运行 | sh script.sh | POSIX 兼容脚本 |
| 以 root 身份运行 | sudo ./script.sh | 需要提升权限的脚本 |
| 在后台运行 | ./script.sh & | 非阻塞执行 |
| 持久运行 | nohup ./script.sh & | 在 SSH 注销后继续运行 |
| 使用 cron 计划 | crontab -e | 定期自动化任务 |
| Source 脚本 | source script.sh | 对当前 shell 应用更改 |
结论
在 Linux 中运行 .sh 文件是解锁系统自动化全部功能的基础技能。核心工作流程很简单:使用 chmod +x 授予执行权限,然后使用 ./script.sh 或 bash script.sh 运行脚本。对于生产环境,结合绝对路径、严格模式、日志记录和 cron 调度来构建强大、可靠的自动化管道。
如果你在服务器上管理脚本,托管基础设施的质量很重要。AlexHost 的 VPS 托管和 专用服务器为你提供完整的 root 访问权限、稳定的正常运行时间和运行自动化工作负载所需的性能——无论你是在安排夜间备份、部署应用程序还是管理复杂的多脚本工作流程。
