近来不得不接触 pwsh,发现竟然设计的这么漂亮。
- pwsh 的设计出发点:pwsh 的命令都是面向对象的,命令返回的是对象,命令传入的也是对象。对象在命令的管道间传递,从而组合出复杂任务。
- 这和 linux 的基于文本动辄 awk, grep 的打法相比跨了一个时代
- 列表式操作,所有的命令几乎都可以适用于单个对象和列表,也可以 filter map reduce
- 输出除了文本,可以接 ConvertToJson, tocsv, to gridview, 贯彻了 MVC 理念。
- 少了一个 C,因为把自己锁定为 shell 了,建议支持鼠标,支持类似 chrome devtool 的 $1 $2 选中对象别名。
- pwsh 实际上是一个 .net 脚本语言,powershell 终端就是一个 REPL 工具
- 美中不足的是作为编程语言这个语言确实有点丑陋,过于强调吸揽 cmd 老用户了,旧瓶装新酒,导致编写复杂程序舒展不开,写出来的代码比较怪。
最根本的问题,从设计上来说,powershell 应该把自己的 system manager 的一套融入 .net 框架,形成一套 .net 库 + annotation库,最好完全使用 .net 实现。
可能在 200x 年初,.net 的表达能力还不足以支持 powershell 的列表式运算,但现在看来,具备 linq 功能的 .net 在操作列表方面比 powershell 只强不弱。
现在 pwsh 形成了一套自己的库,而这些库难以被 .net 使用,导致编程语言锁定在 pwsh,而不能引入其它基于 .net 的脚本语言,如 python, js 甚至 vbs.net,形成一个共同的生态。当然,.net 这方面也很糟糕,IronPython, js 都停摆了,没有友军配合 powershell 就成为单打独斗的孤家寡人了。
powershell 不使用 iterator 也是一个设计失误,这导致 ping -t |where
这种可以方便的实现的 endless pipeline 没有机会实现。如果可以重来一次相信这些缺陷会避免。