我经常打开 PowerShell 需要 7-8 秒。i7-7700HQ CPU,16G 内存。
谈不上孰优孰劣,因为两者的定位本就不同:
PowerShell 是偏向脚本用途的,因为 Windows 下就它一个能打的——cmd 太弱,VBScript/JScript 本质不是干这个的写起来太麻烦,而且一万年不更新随便写个什么东西还会被杀软当成病毒。
而 Linux 下的一通 shell 都是偏向交互式用途的,毕竟要写正经脚本的话有 Python、Perl、Ruby 等等,轮不到你一个 shell。甚至用 shell 写脚本咱都是用“糊”这个词的——因为基本上都是随便写写,不会想着怎么写日后方便维护之类的。
定位的不同就带来了不同的体验:
PowerShell 要照顾脚本体验,那肯定可读性可维护性什么的都得上去吧?那命令肯定不能就只有两个字母,参数也不能是 abcdefg、管道最好传递对象,不然 cut -f2
这种代码过个十天半个月谁还知道第二列到底是啥、传参也不能是 123456、最好还有类型,于是大家搓着搓着就搓成这个样子了——脚本体验倍儿棒,然而交互式体验就勉勉强强了。
首先,启动速度慢,这个是作为交互式 shell 我最不能容忍的。无配置启动时间 0.3 s,如果用上了重量级配置这个数字甚至会达到 1~2 秒。这还能用吗!!作为对比 bash/fish/zsh 的无配置启动时间甚至只有 pwsh 的 1/100,这才是一个合格的交互式 shell 应该有的启动速度。
❯ hyperfine "pwsh -nop -c 'exit'" Benchmark #1: pwsh -nop -c 'exit' Time (mean ± σ): 349.9 ms ± 12.3 ms [User: 411.4 ms, System: 46.4 ms] Range (min … max): 327.8 ms … 369.4 ms 10 runs ❯ hyperfine "fish -c 'exit'" Benchmark #1: fish -c 'exit' Time (mean ± σ): 7.6 ms ± 1.9 ms [User: 5.7 ms, System: 1.9 ms] Range (min … max): 4.9 ms … 14.5 ms 249 runs ❯ hyperfine "zsh -c 'exit'" Benchmark #1: zsh -c 'exit' Time (mean ± σ): 2.8 ms ± 1.3 ms [User: 1.9 ms, System: 1.0 ms] Range (min … max): 1.1 ms … 7.3 ms 443 runs ❯ hyperfine "bash -c 'exit'" Benchmark #1: bash -c 'exit' Time (mean ± σ): 3.0 ms ± 1.9 ms [User: 2.2 ms, System: 0.9 ms] Range (min … max): 1.1 ms … 17.9 ms 464 runs
其次,兼容性问题。这点主要针对在 Linux 下使用的情况(不过说实话如果你在 Windows 上使用 bash 体验也好不到哪儿去……)。
这个兼容性问题绝对不是什么列出文件需要用 dir 而不是 ls 之类的,说这话的人我怀疑根本没怎用过 pwsh。自己手写代码是不会遇到兼容性问题的,有问题的是需要复制别人代码的时候。fish 用户应该对此深有感触,由于 bash 在 Linux shell 中的统治地位,他们常常不得不使用 bash -c 'xxx'
来处理从网上复制来的 bash 代码,甚至有人提出加一个内置命令专门把后面的代码传给 bash 处理。如果对于这一部分有任何异议(如“为啥需要复制代码”、“为啥不自己改一下”)请找一个 fish 用户辩论一下。
排除这两点的话,pwsh 的交互式体验其实还是不错的,可能比不上 zsh/fish,但比 bash 还是强了不少的。比如语法高亮、进行中的 Fish-like autocompletion · Issue #687 · PowerShell/PSReadLine、还有我非常羡慕的有强类型加持的补全系统。
而 bash 这边的脚本体验我觉得不必多说了……各位可以扪心自问一下 bash 的脚本体验如何。那绝对是糟糕透顶:到处都是 123456abcdefg 之类的单字变量/开关、由 shell 展开的通配符、基于字符串的半吊子数据类型、* 和 @ 的区别、时刻注意引号、还有那诡异的语法。
zsh 和 fish 倒是做一定出了改进,但代价就是一个比一个不兼容 bash(zsh 兼容 bash 这种话就不要说了,这就好像说 C++ 兼容 C 一样,甚至还不如 C++ 对 C 的兼容程度……)。
至于生态问题两者其实也是半斤八两,bash 这边可能还更差一点。因为 pwsh 放到 Linux 上能直接拿 Linux 上的命令行工具来用(虽然你有几率被管道坑到……),bash 反过来却难以在 Windows 上调用 COM 组件调 WMI 。
===以下为牢骚===
有些人说到底都是偏见,我估计用都没用用过 pwsh 就来这里黑了,黑都黑不到点子上。
pwsh 不兼容 bash 所以不行?fish 也不兼容为啥照样大把人用做交互式 shell?
管道传对象是邪道?evlish、nushell 表示你这个地图炮开得有点大啊……
还有很多人拿 Linux 上的 bash 和 Windows 上的 pwsh 比 Linux 下的常用操作。你咋不倒过来比?pwsh 在 Windows 上还能调用 Excel 处理表格甚至画图、WMI 包揽系统管理,你们 Linux 这边好像没一个能打的?是不是生态不行啊?更别说大部分 Linux 下的常用工具都有 Windows 版本,甚至还能装 MinGW/CygWin/WSL。
利益相关:Linux 下的 zsh 用户(
更新一下:
我说 Bash 是垃圾貌似让一些人“信仰崩塌”了,默认的东西就应该顶礼膜拜不容差评吗?这种认知是非常不好的。说 Bash 是垃圾不等于说 Linux 或 GNU 是垃圾啊。
如果说它是垃圾过分了,那准确点说就是“历史垃圾”,有一堆历史包袱,所以充满了糟粕。
再更新一下(这部分主要怼奇葩,过一段时间会移动到最后):
这人挺逗的,他把「有很多替代品」当成 Bash 是垃圾的“证明”了。然后基于自己小学学前没毕业的理解能力跑来评论区瞎喷。笑死。
一个基本三零的用户写了五百多个点赞为零的回答,居然称我的回答“没营养”。把自己不经过某主要器官就乱喷的评论称之为“习惯性吐槽”。
我问他眼神是否正常?因为我在最前面就写了“后续”会更新有关 Bash 如何糟粕的内容。然后他又开始教我草稿怎么用,噗,草稿能告诉别人后续还有更新?你用懂知乎了吗?
而且上面还在喷自行扭曲后产生的「替代品多等于垃圾」观点。现在又喷我没有说明它为什么是垃圾。笑死。这并不能证明你没有乱喷的事实啊?
嗯…… 这样就溜了?说好的奉陪呢,这下又不关您事儿了?虽然我清楚得很这类人懂个毛啊,根本就没有讨论的能力可言。但我还是想说,学习顺序简直错误啊,他就不应该先学 Bash 的拼写,而是先回去重读小学语文。
这个纯三零的用户更会评论,娱乐性简直吊打楼上:
这句话我怎么看都怎么想笑。Windows 没有命令行生态所以 bash 是垃圾?这已经可以把 Windows 扭曲成苹果的软件产品了吧。
然后举了一个更搞笑的例子,“贝克汉姆不打篮球,所以乔丹也是垃圾”。我想不明白你们来这发评论是来搞笑的,还是丢人的。你前一句话还至少都和命令行相关,怎么后一句扯了一个跟篮球毫无关系的人去证明篮球垃圾呢?动动脑子啊,你扭曲我的观点没关系,你把自己的观点都扭曲了啊。
我建议这些人还是不评论得好。说实在的,你们懂技术吗?短期培训出来的?甚至这都不重要,你们连最基本的理解和辩论能力都不具备,还在这发些丢人言论瞎喷,完全就是为我的回答创建更新素材啊。
用 PowerShell 去对比 Bash 无法解释这个问题,甚至都不沾边,因为 Bash 在 Linux 上也是个垃圾。如果你是 Linux 新手或 Windows 用户大概会疑惑,Linux 命令行不是很强大方便吗?Bash 居然是垃圾?
是的,因为这些跟 Bash 无关。Linux 上存在大量的 Bash 替代品,我们有很多的人压根不用 Bash。
你要稍微有点追求就应该知道它是一个很恶劣、糟粕的东西。为了让这个垃圾能写出可维护、漏洞少,像点样子的东西,业界总结出了好几百条应该遵守的规范:
https:// github.com/koalaman/she llcheck
PowerShell 作为一个晚了这么多年的软件如果连 Bash 都超不过那微软的人可以直接切腹谢罪了。无论是 PowerShell 还是更强大得多得多的 Shell 也不能直接颠覆 Windows 命令行的现状,因为 Windows 日常软件压根没有命令行生态可言。
你 Shell 程序再强大能让 QQ 在终端窗口中聊天吗?毕竟 QQ 作为一个国内最常用的 Windows 软件压根不理会命令行,没有提供任何接口。
所以命令行能做什么不取决于 Shell 程序的强弱。Shell 首先是一个调度各个外部程序的胶水,现在的 Windows 没有多少可用的外部程序。
一个基本没有生态可言的系统,固然也大大降低了出现更强大的 Shell 程序,终端软件的意义。所以 Windows 上烂得要死的 cmd 都能存活那么多年,毕竟使用它的需求太少,太简单。
不过当前现状确实在改善,例如 Chocolatey 和 Scoop 这种命令行包管理工具。它们可以实现很多图形化软件在终端的静默安装,这与 Windows 提供了更强的 Shell 也是密不可分的。
在 Windows 服务器上应该有更多类似的东西,因为服务端软件普遍要迎合没有图形界面的需求。
所以命令行好用不好用就是生态决定的,有更强的 Shell 程序能促使这个生态更好的发展。而 Linux 的命令行软件生态比图形软件还要强,这是当初的基因决定的。
这个问题需要从至少 3 个不同的方面来看——首先你得把 Shell 和 Terminal 这两个概念分开,然后还要考虑的是围绕命令行界面(CLI)所构建的生态环境。很多人都把他们混在了一起,得出的结论就大不相同甚至截然相反。
Shell 就是真正解释并执行命令的那个程序,比如 cmd/PowerShell/bash,它们各自使用自己的语言,比如 cmd 使用的语言叫 Batch(批处理)。Terminal 是用来显示结果、处理输入输出的那个程序,Windows 上自带的叫 conhost,Linux 不同的桌面环境自带的 Terminal 不同。由于 bash 是大多数 Linux 发行版默认的 shell,下面就都是拿他跟 cmd/PowerShell 作比较了。
从 Shell 语言所提供的功能角度讲,Batch 无疑是这三个当中最弱鸡的,例如没有函数(只能用 CALL 和标签模拟)、没有 switch-case 等等。PowerShell 功能最强,面向对象、并且与 .net 有良好的互操作性,甚至可以嵌入 C# 代码:
$id = get-random $code = @" using System; namespace HelloWorld { public class Program$id { public static void Main(){ Console.WriteLine("Hello world!"); } } } "@ Add-Type -TypeDefinition $code -Language CSharp iex "[HelloWorld.Program$id]::Main()"
当然 Bash 也能模拟一下面向对象甚至函数式编程,但这不是语言提供的一等功能。PowerShell 也有一个相当明显的缺点,就是跟 bash 相比太啰唆。
从 Shell 程序所提供的功能角度讲,cmd 仍然是最弱鸡的,例如历史记录无法持久化保存、没有 profile 支持。PowerShell 目前这两点都是支持的。
因此如果有人说 cmd(Batch) 比 bash 差,这完全没有问题。但是要是拿 PowerShell 跟 bash 相比,我认为还是 PS 技高一筹。
下面说一下 Terminal:Windows 自带的那个 conhost 被 Linux 上一众 Terminals 吊打我认为毫无问题,随便就能想得到很多槽点(有一些槽点在 Windows 10 上解决了,但还是很想吐):
由于 conhost 在兼容性上无法妥协,因此有了新的 Windows Terminal。还有很多其他的第三方 Terminal,比如 ConEmu,不过这些都不是“系统自带”的。因此如果有人说 conhost 难用的一批,请不要反驳并加入他们。
最后是围绕命令行界面所构建的生态。从系统管理与维护的角度讲,其实 Windows 与 Linux 并没有太大差距,比如 Windows ServerCore 就是不带桌面环境的 Windows Server。还有很多程序专门提供了 PowerShell Module 来对软件进行管理,例如 CosmosDB Emulator。
但在其他方面(第三方程序的丰富程度、命令行包管理器等),Linux 无疑要比 Windows 强很多,甚至 bash 不喜欢的话还可以换别的。我认为主要原因在于 Linux 的桌面环境不是必需品,用户用什么桌面环境、甚至有没有桌面环境都不一定,而 Windows API 就实实在在在那,还有相当好的兼容性,图形界面又对普通用户更友好。这样的 API 不用白不用,用了不白用,白用谁不用 _(:з」∠)_
你要拿cmd去和bash比,那是欺负人。
但是你说powershell和bash,本质上来说PowerShell不论是设计理念还是各方面都是全方位领先的。差别主要就是生态和偏见了。
当然,powershell的版本和需要手动安装也是个麻烦事儿。
我这边只随便说一点,PowerShell有完整的dotnet支持,很多问题你要依赖某个小工具的,PowerShell可以直接调dotnet类库来解决。这并不是写个脚本或者程序,而是PowerShell本质上就是dotnet的命令行前端。
其实,有些人真的是非常完美的诠释了什么叫做偏见:
例如大家都熟悉 ls是列目录,非要来一个 dir。
事实上我估计dir比他的年龄都大,而且,你要真说是列目录的话,dir是directory的缩写,ls则是list的缩写,你说哪个更贴近列目录?而dir和ls都是pwsh的alias这种常识我都懒得说了。
更搞笑的是:
都不明白bash的精髓吗?bash的精髓不是语法,而是能将一堆Linux命令轻松的包裹在一起。语法再高级,再完备有啥用,这个世界缺高级动态语言吗?Python够不够?缺的是各种小工具。
真是不好意思,这个精髓被pwsh几乎完全的继承并且发扬光大了,那就是pwsh的管道,说发扬光大是因为pwsh的管道是强类型的。
pwsh内置的绝大多数指令都可以直接通过管道来解决。比如说我们需要递归列出所有a开头的文件,我们会写:
ls a* -r
不用怀疑pwsh是完全支持这个脚本的。
好了,我们现在确认了,我们要把这些文件删掉,怎么做?
因为pwsh管道传输的是对象,而且所有的内置指令几乎都支持管道,所以:
ls a* -r | rm
完事……你完全不用考虑ls输出的格式是什么,有没有全路径什么的,因为,管道传输的是对象!
你再看看这个精髓,pwsh这个学生,学的不错吧……
更别说,pwsh还有非常强大的where和select……
ls -r |? Name -like a* |? Length -lt 10000 |select -First 10| rm
你现在告诉我,这是bash的精髓,还是pwsh的?
我真心觉得这是欺负人……
对了,pwsh还可以呼叫帮凶dotnet:
ls |? LastWriteTime -gt ([System.DateTime]::Now.AddDays( -100 ))
数百万个基础类型的小工具够不够?
====================================================
其实大部分人说了半天就是这么一句话:
新东西是不可能学的,这辈子都不可能学的,dotnet又不会,只能用bash这样子,才能维持的了生活这样。用bash就像回家一样,指令个个都是人才,缩写又很漂亮,我超喜欢bash的……
嗯,祝好……
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有