命令计算机做事:从 GUI 到 Shell 的觉醒
Telling a Computer to Do Things
职业生涯初期,我只会用终端运行零散命令,却不知如何让计算机执行逻辑或串联多个程序。我误以为 Shell 只是启动无 GUI 程序的简陋工具。直到学会编写脚本,我才真正掌握了让计算机“做事”的能力。许多工程师过度依赖 GUI,一旦遇到 GUI 无法处理的场景便束手无策。其实,掌握 Shell 的关键不在于语法,而在于熟悉 fzf、rsync、xargs 等工具。这些工具能像积木一样组合,极大提升效率。即使不是 Shell 专家,只要懂得串联工具,就能让工作流更灵活高效。
教会计算机做事,20% 靠语法,80% 靠拥有好用的工具箱。
HN 评论区
36- utopiah
没错,而且我也认为脚本化的范畴远不止于终端。
在终端里写脚本同样可以操作窗口(例如用 xdg-open 配合 KWin),或者向任意设备发送本地通知(例如 notify-send,或者 ntfy),或者弹出对话框(例如 kdialog),或者控制其他设备(例如用 curl 调用 HomeAssistant API)。所以,这确实开启了一个全新的可能性世界……而且这些能力是可以组合使用的。
再补充一点背景:脚本化甚至能在各种最古怪、最新潮的设备上运行,比如得益于 Termux,Meta Quest 在 Android 上也能跑脚本。只要有操作系统,里面肯定就有终端,而只要有终端,就能写脚本。所以……脚本化绝不仅仅局限于你的台式机或远程服务器,它无处不在。
- adityaathalye
在我看来,脚本语言本身对 Shell 脚本强大能力的贡献其实是最小的。我的排序如下:
1. 通用的进程间接口:通过标准输入/输出/错误接口实现任意程序的组合,以及“万物皆文件”的抽象……如果没有这样的核心设计决策,其余一切都不可能实现(“万物皆对象”是它的孪生兄弟)。
2. 广泛的标准工具:核心工具普遍可用,且设计初衷就是基于同样的抽象进行协作,这紧随其后。再加上某种默认脚本语言,也是为同样的计算模型而构建的。
3. 首选语言:这对易用性很重要,但在原始威力方面只能排到遥远的第三位,无论是 bash、perl、awk、node 还是 clojure(babashka)等等。这不过是锦上添花,因为如果别无选择,Shell 程序依然会非常强大。事实胜于雄辩——那些“真正重要的脚本”永远都是 /bin/sh。
一般来说,学习如何避开 sh 和 bash 的陷阱,主要只需要做一些基础的研究阅读:手册、经验总结以及警告(我超爱 BashPitfalls)。要么这样,要么就是靠复制粘贴代码硬着头皮学,运气不好时,可能会 rm -rf 掉不该删的东西。
花上一天时间读手册是无可替代的。虽然内容很多,但这并不是什么魔法,你可以按照自己的节奏,一口一口地把这头大象吃掉。说真的……那些反复试错所花费的时钟时间……
- necovek
关于文章中提出的更高层面的问题:为什么人们不用他们的主语言来处理基本的文件和命令管理?
我认为答案和为什么 Python 尽管存在诸多众所周知的缺陷却依然 hugely 流行是一样的:自带电池(batteries included)。
Shell 语言包含了太多巧妙而简洁的方式来执行命令、处理输入输出和退出码、利用通配符简单遍历深层目录结构,以及使用像 'find' 或 'xargs' 这样的高级工具,相比之下,其他语言显得非常不顺手。
而且它们默认就是小众的(直到被广泛使用),所以即使你招募了一位你首选语言的专家,他们对你首选语言中那些专注于 Shell 的库也一无所知。