15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
02.09.2025

如何在 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.sh

x 标志确认该文件现在可由所有者、组和其他人执行。

> 安全提示:如果您想将执行权限限制为仅文件所有者,请使用 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.sh

bash 和 sh 之间的区别

命令解释器支持 Bash 特定功能
bash script.shGNU Bash
sh script.shPOSIX 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 -e

Cron 语法

* * * * * /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:000 2 * * *夜间数据库备份
每周一早上 6:000 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路径错误或文件丢失使用 lspwd 验证路径
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 bash

2. 启用严格模式

在每个生产脚本的顶部附近添加:

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>&1

7. 首先在安全环境中测试脚本

在将脚本部署到生产服务器之前,请在暂存环境或一次性 VPS 实例上测试它,以免错误导致停机。

在 Linux 服务器上运行 Shell 脚本:实际考虑

在远程 Linux 服务器上运行脚本时 — 无论是在共享环境还是专用机器上 — 需要考虑几个额外的因素:

  • SSH 访问:大多数服务器端脚本编写都通过 SSH 进行。screentmux 等工具可让您维护持久会话,以便长时间运行的脚本在断开连接后继续存在。
  • 用户权限:在共享
15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用