我经常打开 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的……
嗯,祝好……
好比我开个银行,免费给你存钱,结果你2秒钟存进去的钱,我告诉你要取钱你得在我这站两星期。你怒不怒?品一品。
其实解决这个方法简单,把上传也限速即可。然而百度是即想要你上传的文件,又不想让你痛快下载,就形成了现在的上传一瞬间,下载一辈子的情况。
哪怕是个免费的服务,如果你上传只要一瞬间的东西下载要花几天一星期才能下来,你都会觉得它在抢劫。
我个人觉得限速是可以接受的,然而网盘这东西跟视频不同,里面的内容是用户免费提供的,你至少要能够提供不低于上传的下载速度,否则这不就是抢劫么,你的就是我的,我的还是我的?
这两个游戏都有自己的问题。但严重程度完全不一样。
赛博朋克最大的问题是人力不够,没有人手把愿景在限期内做出来,导致后期狂砍。但从已有的成品来看,CDPR是完全有人才有能力把东西做出来的,只不过没时间做。光影效果,已有的垂直城市设计,以及主线和很多支线任务的演出都有毫不输巫师3的气质,尤其是日本城浮空平台那关,无论是游戏流程还是画面还是音乐,都把类似银翼杀手2047的那种气氛和感受做到了极致。有人说CDPR的人才都跑了,或者CDPR傲娇了开始放水,这并不客观。2077确实是个半成品,主机优化的问题尤其严重,但你关注已经完成的部分,用高配置PC玩,其质量并未令人失望,依然是巫师3的水准。
2077就像是一个优等生忘了做背后的几题的考卷,开天窗导致不及格,但已经做了的题目还是正确率极高的。
谈到E3的demo,单从画面上讲你很难说它缩水了。只不过CDPR没告诉你想要E3画面,就得上3080+光线追踪。。。
我猜想没有光追的话,游戏在大多数情况下也是可以达到光追的效果的,只不过人工工作量会很大,有些地方需要离线烘培,而有些地方需要人工设置虚拟光源。CDPR可能发现项目后期工作量太大搂不住了,就上了光追这个大杀器。。。
至于无人深空,现在口碑很好,但我要不客气地讲,这个游戏到了今天依然是垃圾,只配卖$19.95,打折的时候卖2.95的那种。
Hello工作室自始自终都没有把初始愿景实现的技术能力。
你可以看无人深空进入大气层的技术实现。先是一段飞船进入大气层摩擦发红的特效,然后可以看见地形通过一种非常粗糙、视距很近的情况下刷新出来,并且刷出来的地貌和太空中看到的地貌完全不同。所以从头到尾,hello工作室都没有类似精英危险和星际公民的无缝行星登陆技术。
无人深空更新了十几次,并没有触动这个游戏除了机械刷就没有任何深度的本质。这是一个极其无聊的游戏。但它刷了两年的DLC,玩家也就给他点面子,没功劳有苦劳。它每次更新我都会进游戏看看,但玩不了半小时就会放弃。一是实在无聊,二是它美术设计和渲染水平有限,色彩及其刺眼。比如在母船机库里,到处都是亮瞎狗眼的点状光源,但这些光源不会照亮周围的任何东西,看的时间长了有种不带护目镜看焊接的流泪效果。你说更新了那么久,这么简单的问题都不解决,有什么用呢。游戏中随处可见低级设计的痕迹,比如说有很多行星上有一种可以卖钱的球,这种球没有任何贴图,只有亮瞎眼的纯白色材质,在HDR效果下极其刺眼,但它又不是个光源,放在地上不会照亮周围任何东西。这种打开Blender就存盘的建模初手垃圾素材居然也能放在游戏里,真是活久见。
所以无人深空就像是一个学渣冒充学霸,把期望提得无限高,却每题都答错结果接近0分,被骂,然后花了漫长的时间在那里订正,一题一题的改,最后终于接近30分了,然后获得了大家的赞赏,全然忘记了它改了那么久依然是不及格。
无人深空的贴图我就不贴了,首发的时候真是纯垃圾,基本上是2008年魔兽世界首发的那个水准。现在也依然是垃圾,开个HDR看着眼睛都疼。