Linux 命令和 Shell 技能
Bash 脚本:从“在我的盒子上运行”到生产
当一项任务具有粘合性时,Bash 就赢得了自己的位置:编排命令,整理简单文本,并完全保持在盒子上。它的行业声誉来自于登陆,而不是想法:未经测试的管道被运送到服务器上的 cron 中,其中一个变量未设置或一个文件名有空格。该规则是机械的且廉价的,它由四个部分组成:严格模式、引用、shellcheck 和记录操作人员稍后读取的方式。
要点
- 每个重要的脚本都以 set -euo pipelinefail 打开:未设置变量失败,命令失败停止脚本,管道浮出水面;如果没有它,错误就会默默地传递,直到到达生产环境。
- 引用变量和命令替换:“$var”和“$(cmd)”;空格上的分词是一直以来的经典,而 IFS 摆弄一些网站推荐的错误是您选择记住的错误。
- 大括号扩展发生在变量之前: rm -rf "${CLEANUP:?}"/{a,b} with CLEANUP unset 扩展与预期不同,并删除您想要保留的内容; ${VAR:?} 检查是值得学习一次的 rm 安全习惯用法。
- shellcheck 在每次更改中都占有一席之地:它捕获未加引号的 glob、无法访问的代码以及使用空格的文件名的“for f in $(ls)”模式;在 CI 中运行它,错误就会停止到达 cron。
- 临时工作和清理是配对的:TMP=$(mktemp -d),trap 'rm -rf "$TMP"' EXIT,并且没有孤立的暂存目录,并且每个分支上都没有“如果错误则删除”。
- 以安全的方式读取循环: while IFS= read -r -d '' f 通过 find -print0 处理带有换行符和空格的文件名; 'for f in $(ls)' 是 bug shellcheck 标志,并且到处的旧脚本仍然带有该错误。
- 退出代码和日志与操作人员对话:使用阶段名称将失败回显到 stderr (>&2),在真正失败时退出非零值,并让 cron 的邮件或日志向您显示凌晨 3 点实际需要的一行。
- 尽早升级:JSON 解析、三层以上嵌套、HTTP 调用或任何属于 Python 或 awk 的有状态逻辑; bash 致力于成为一种通用语言,这是它赢得声誉的原因。
一线手记
我们的大括号扩展疤痕: rm -rf "${CLEANUP}"/{a,b} with CLEANUP unset 完全按照 shell 想要的方式(而不是意图)扩展。现在,每一条这样的路径都带有 ${VAR:?} 保护,并且没有人两次支付该账单。
常见问题
#!/bin/bash 还是 #!/usr/bin/env bash?
env 在容器和 macOS 安装中获胜,而 bash 位于其他地方; shebang 的重要性不如 set -euo pipelinefail 的实际存在和 shellcheck 传递的每一个更改重要。
我的脚本手动运行但在 cron 中失败。为什么?
Cron 在裸环境中运行:路径很短,没有登录配置文件,相对路径指向错误的主目录。使用绝对路径,显式设置 PATH,并保留 bash -x 重播以进行调试。
用于服务器任务的 Bash 还是 Python?
Bash 用于主要协调现有系统工具并保持小型的管道;用于结构化数据、API 和错误处理的 Python,必须在调用时继续存在。强迫 bash 玩 Python 是事件的名称。
如何安全地编写删除脚本?
引用每个变量,仅针对 mktemp 生成的或显式配置的路径,以打印它将删除的内容的试运行模式运行,并让 ${VAR:?} 在 rm 看到变量之前保护否决取消设置的变量。
Kinetikatech 如何在linux 命令和 shell 技能方面为您提供帮助
您不必自己成为linux 命令和 shell 技能专家:决定管理员是操作服务器还是对抗服务器的命令和脚本编写习惯:使用每个基本安装中的工具搜索、转换、传输和监督文本和进程。Linux 服务器安全和服务器管理正是为此而设:配置、加固、监控,并有工程师日夜值守。