命令行的进化:CMD、PowerShell 和 Bash

610 阅读5分钟

引子

在图形界面横行的今天,命令行看起来就像上个世纪的老古董。但真相是——每一行命令背后,藏着整个操作系统的灵魂。

无论是 Windows 上的 CMD,Linux/macOS 上的 Bash,还是微软后来力推的 PowerShell,它们不仅是开发者的得力助手,更是技术演进的缩影。每个命令、每个符号,都是一代工程师试图解决某个痛点的答案。

本篇,就让我们沿着命令行的时间轴,看看它如何从上世纪的字符终端,一步步走到云计算和 AI 驱动的今天。

🎯 演进时间线一图流

image.png


一、诞生的背后:它们到底在解决什么问题?

CMD:MS-DOS 留下的“历史债务”

CMD 诞生的使命其实很朴素——兼容老软件,别让几十年前的脚本白写了。

1981 年,MS-DOS 面世,command.com 成为当时的默认命令行。后来进入 Windows 时代,cmd.exe 接过了接力棒。虽然功能有限,但它承担了“兼容老脚本”“帮 Windows 用户跑批处理”的重要角色。

一句话总结:CMD 不是为了创新,而是为了不让旧时代崩溃。


PowerShell:Windows 自动化的自我救赎

到了 2000 年代,Windows 运维界一片混乱:

  • CMD,功能太弱。
  • VBScript,写的人抓狂,看的人更崩溃。
  • 图形界面点点点,根本没法自动化。

于是,微软的 Jeffrey Snover 提出了一个惊世骇俗的想法:为什么命令行不能直接操作对象?

这就是后来 PowerShell 的核心思想——对象管道。命令不再传递一堆字符串,而是传递带属性、带方法的对象。你可以直接对文件、进程、服务下手,无需靠什么 awkgrep 拼命切字符串。

比如你想查看 nginx 进程的内存占用,只能先拿到一堆文本,再自己想办法提取出有用的字段。

ps aux | grep nginx | awk '{print $4}'

这段命令做了什么?

  • ps aux → 列出所有进程(输出一大坨文本)
  • grep nginx → 从文本中过滤出包含 nginx 的行
  • awk '{print $4}' → 拿到第四列(通常是内存占用)

但这里有个致命问题:一旦输出格式变了,这个命令就废了。

比如不同的 Linux 发行版、不同版本的 ps 命令,字段位置可能变,空格数量可能变,甚至列标题变长都会导致 awk '{print $4}' 报错或者结果错位。

而 PowerShell 传递的不是文本,而是 .NET 对象。每个对象都有属性,结构化、标准化,不再依赖格式推测。

对应的 PowerShell 写法:

Get-Process nginx | Select-Object -ExpandProperty CPU

解释一下:

  • Get-Process nginx → 返回的是一个 进程对象列表,每个对象都包含标准字段,比如 CPU、Memory、ProcessName 等。

  • Select-Object -ExpandProperty CPU → 直接提取这个对象的 CPU 使用率。

  • 没有文本解析,没有位置依赖、没有空格错位的问题

  • 哪怕操作的是一台 Windows、本地 Linux,还是云端容器,对象结构是统一的

  • 可以链式继续操作:

    Get-Process nginx | Where-Object { $_.CPU -gt 80 } | Stop-Process
    

Bash:开源世界的“共同语言”

Bash 的出现其实更像一场“自由之战”。

1988 年,GNU 项目需要一个开源的 Shell,来取代当时专有的 Bourne Shell。于是,Brian Fox 写下了 Bash(Bourne-Again Shell)。

它不仅保留了 Unix 世界的命令行传统,还不断加入诸如命令补全、作业管理、数组、函数等高级功能。Bash 逐渐成了 Linux 开发者的母语,也成了开源生态的命脉之一。


二、技术进化:谁在原地踏步,谁在狂飙?

CMD:稳如老狗,也老得发霉

  • 功能?能跑就行。
  • 创新?别想了。
  • 它的存在感,更多是“我不主动退役,你也没法彻底抛弃”。

PowerShell:从 Windows 到全世界

版本年份大事件
1.02006初代发布,终于告别 VBScript
3.02012支持模块自动加载,舒服多了
5.02015加入类定义,开始支持 OOP
6.0+2018跨平台,跑到 Linux 和 macOS 上

当微软宣布 PowerShell 开源、支持 Linux/macOS 时,很多人都知道,这已经不仅仅是 Windows 的工具,而是云时代的自动化中枢


Bash:从服务器跑进了 Windows

Bash 的强大来自社区,30 多年来,它不断进化:

  • 支持函数、数组、正则。
  • 有 Zsh、Fish 这样的兄弟竞品,但它依然是脚本领域的事实标准
  • 更牛的是,2016 年,微软通过 WSL(Windows Subsystem for Linux)让 Bash 正式进驻 Windows。开发者终于不用在 Windows 和 Linux 之间反复横跳了。

三、核心哲学:文本 vs 对象

管道的本质区别

  • Bash/CMD:传递的是“文本” 。所以你经常看到这样:

    ps aux | grep nginx | awk '{print $4}'
    

    ——输出是字符串,后续处理全靠你自己解析。

  • PowerShell:传递的是“对象” 。直接操作属性,省事又优雅:

    Get-Process nginx | Select-Object -ExpandProperty CPU
    

脚本能力对比

CMDBashPowerShell
易用性简单但功能弱易上手,符号多稍绕上手陡,功能极强
安全性基本没靠文件权限有执行策略保护
扩展性没有社区脚本库丰富模块化 + 面向对象
跨平台Windows 独有Linux/macOS/WSLWindows + Linux + Mac

四、今天的命令行,早就不是单打独斗

  • CMD:老系统的守门人,跑跑批处理,救急。
  • Bash:开发者的万能胶,从服务器到 CI/CD,无所不在。
  • PowerShell:企业级 DevOps 自动化的主力军,尤其在 Azure 和多云管理场景下一骑绝尘。

五、未来趋势:命令行不会死,反而更猛

  • Bash:依旧坚挺,特别是在云原生、容器编排(Kubernetes)里,它就是 glue code(胶水)。

  • PowerShell:越来越像 DevOps 世界的瑞士军刀,支持混合云、本地集群,甚至 AI Copilot 正在学会帮你写 PowerShell 脚本。

  • AI + CLI:未来的命令行,可能不仅是命令,更是自然语言驱动的半自动脚本。比如——

    “帮我查一下 A 集群 CPU 用量,把高于 80% 的节点拉出来重启。”
    ——Copilot 自动转成 PowerShell 或 Bash 脚本。


结语:命令行,从未过时

  • CMD,活在兼容性里
  • Bash,活在开源生态里
  • PowerShell,活在云端自动化里

命令行不是老掉牙的工具,而是这个数字世界里最简洁、最高效、最具创造力的接口之一。

技术的演化,从不是消灭谁,而是融合谁。


🚀 关于 Dev Odyssey

「Dev Odyssey」是一张为开发者绘制的成长航海图。
从计算机底层,到前沿技术;从系统思维,到智能时代。路线图、时间轴、技能矩阵,都是你穿越迷雾的指南针。

🌐 在线体验:dev-odyssey.pages.dev
💻 项目开源:github.com/tuaran/dev-…

愿每一个热爱技术的灵魂,都能在属于自己的奥赛德之旅中,驶向星辰大海。