工具与资源robertmuth.blogspot.com
15 分钟写出更好的 Bash
Better bash in 15 minutes
2014 — 2021,它一次次回到首页
黑点是上首页(≥ 50 分)的那次投稿,空心点是没冲上去的投稿,点越大分数越高。
导读
这是一篇 2012 年的博客文章,用 15 分钟快速介绍如何写出更健壮的 bash 脚本,涵盖 set -e、set -o nounset、pipefail、trap 等常用技巧。文章时隔多年两度登上 Hacker News 首页,是 shell 脚本入门进阶的经典参考。
为什么经久不衰:bash 脚本至今仍是日常运维和开发的基本功,这些防御性写法能避免脚本静默出错甚至造成破坏,历久弥新。
HN 评论精选
set -e 需配合 pipefail 才能捕获管道中前段命令的失败
如果你用了 set -o errexit(即 set -e),那多半还应该加上 set -o pipefail。否则它只检查最后一条命令是否成功,像 ls *.ssjkfle | wc -l 这样即使 ls 失败了,整个命令仍会被当作成功继续执行。
phaemon查看英文原文
If you're using: set -o errexit # or set -e if you prefer Then you probably also want: set -o pipefail Otherwise, it only checks that the last command succeeds, so something like: ls *.ssjkfle | wc -l will actually continue as success despite the "ls" failing.
不加 nounset 时未定义变量会引发灾难性后果
set -o nounset 是必备选项。我刚吃过苦头:三星打印机设置工具的卸载脚本没有设置变量,sudo ./uninstall 直接把 /opt 整个删掉了。
rshm查看英文原文
'set -o nounset' is a must have. I Just suffered this script from Samsung Printer setting Utility. sudo ./uninstall wiped the /opt DEST_PATH=/opt/$VENDOR/$DEST_DIRNAME #remove destination VERSION=`cat "$DEST_PATH/bin/.version"` if rm -fr "$DEST_PATH"; then echo "INFO: $APP_NAME (ver.$VERSION) has been uninstalled successfully." ...
用 trap 在脚本退出时自动做清理
另一个很有用的清理手段是 trap:定义一个 cleanup 函数,然后用 trap cleanup EXIT,在脚本退出时自动执行。
narsil查看英文原文
Another useful capability I use to do cleanup is `trap`. function cleanup { ... } trap cleanup EXIT See more here: http://linux.die.net/Bash-Beginners-Guide/sect_12_02.html
shebang 用 env bash 更可移植
建议用 #!/usr/bin/env bash 代替 #!/bin/bash,这样脚本不依赖 bash(或其他可执行文件)恰好位于 /bin,可移植性更好。
kirubakaran查看英文原文
Use: #!/usr/bin/env bash Instead of: #!/bin/bash This makes the script more portable as you don't rely on bash (or any executable) to be in /bin. http://en.wikipedia.org/wiki/Shebang_(Unix)#Portability
历次讨论
同类还值得读
直接在浏览器中启动 Linux 内核
Boot a linux kernel right inside your browser.
Fabrice Bellard 的 JSLinux 页面,用 JavaScript 在浏览器里启动一个 Linux 内核,并提供一个可交互的终端环境。
工具与资源上首页 5 次 · 2011–2025bellard.orgHacker News 未公开功能与行为清单(2018)
A List of Hacker News's Undocumented Features and Behaviors (2018)
数据科学家 Max Woolf 整理的 Hacker News 未公开功能与行为清单,涵盖投票机制、排名算法、账号惩罚等社区运作细节。
工具与资源上首页 5 次 · 2019–2025github.comMapSCII:在终端中用盲文和 ASCII 渲染地图
MapSCII – Braille and ASCII map renderer for the console
MapSCII 是一个在命令行终端里渲染地图的开源工具,用盲文字符和 ASCII 字符把地理数据画成可交互浏览的字符地图。
工具与资源上首页 5 次 · 2017–2025github.com顶尖大学的免费在线课程
Free Online Courses from Top Universities
Open Culture 整理的一份免费在线课程合集,汇集了全球顶尖大学(如 MIT、斯坦福、耶鲁等)向公众开放的网络课程资源,涵盖音频、视频等多种形式。
工具与资源上首页 5 次 · 2010–2022openculture.com淘气字符串:容易引发用户输入问题的字符串清单
Naughty Strings: A list of strings likely to cause issues as user-input data
一个 GitHub 仓库,收录了大量容易让程序出问题的用户输入字符串,如特殊字符、emoji、SQL 注入片段、系统命令等,供开发者用于测试输入处理逻辑。
工具与资源上首页 4 次 · 2015–2020github.com