坑边闲话:万事万物,有始有终。直从萌芽拔,高自毫末始。所谓的 Shell,无非是应用程序与操作系统内核进行交互的一个中间程序而已。我本人玩电脑也有很久一阵子了,最开始接触到的就是 Windows 7 操作系统,当时 Windows 7 上市不久,我在那台 20 英寸的液晶显示器上看了很多 PC 的知识。但是我第一次接触 Shell,却是在 Linux 上。

Linux 上最常用的是 Bash,这是一个对于 Bourne Shell 的再造版,完全免费、开源,而且很好用。而 Linux 上的 zsh 也不错,而且很多提示功能非常贴心。就这么一个好用的 shell 程序,自然身受很多程序员的喜爱。玩电脑怎么能不搞点自动化呢?

想想有哪些东西需要自动化?我列举几个:

  • 写了一个程序,要用来编译、测试、测试完再清理编译的产物,这个时候需要一个自动化的操作
  • 用 LaTeX 写了一篇论文或者文章,希望能自动进行编译,然后自动清理产生的 auxlog 等中间产物,只留下编译产生的 PDF 文件
  • 喜欢一个网页或者博客,希望及时收到这个网页的更新,这个时候你需要一个程序,自动地每隔几秒、几分钟、数小时发起一次 HTTP 请求,然后获得页面中相应部分的更新情况(比如淘宝页面,价格是否变化了?)
  • 自己的系统装了很多软件,希望能够批量进行更新情况检查,一旦有部分软件出了新版,就自动联网更新。

上述的几个情况比较特殊,但是确确实实贴近我们的生活。最初的 Windows 系统,并不支持这种内建的自动化操作,你能想到的也就是 cmd 命令行。而这个命令行确实非常难用,让一些追求软件美感的人望而却步(嗤之以鼻)。

1、何以 UNIX/Linux·

UNIX 是从实验室里走出来的操作系统,小巧、高效、简洁、开放。而 Linux 作为 UNIX 的净室再现,也相应地具有了 UNIX 的各种优点,也兼容 UNIX 系统的很多程序。等到把 GCC 移植到 Linux 之后,Linux 的增长曲线开始发力,因为一旦有了某个平台的编译器,我们只需要把其他平台的源代码拿过来编译一遍,就得到了适用于新平台的软件。当然,前提是新平台符合 POSIX 标准。

那么为何 bash 在 UNIX 世界里这么受欢迎呢?我认为有以下几个原因。

  1. 使用者生活在一个自由的环境里
  2. 使用者的知识水平比较高,众所周知,BSD 版本的 UNIX 是在伯克利大学流传开来的,那里的师生什么水平、什么审美,相信大家有目共睹
  3. UNIX 的伪终端非常好用,以 macOS 为例,你可以直接在 Terminal 里面,用键盘复制、粘贴,而其他诸如 Linux 自带的终端也很好用
  4. Bash 的开发很有趣,相关的程序很给力,比如 GNU 软件,awk、perl、sed 等程序,非常适合命令行下操作字符串
  5. 很有美感

以上种种原因,使得 bash 脚本在 UNIX 世界里广受欢迎,你只要稍加练习,就会爱上这门语言。

但是,PC 装机份额最大的 Windows 用户,在这一方面却始终处于水深火热之中。怀抱着丑陋的 cmd,用着蹩脚的复制、粘贴操作。更重要的是,很多 Windows 用户并不知道竟然可以自己写脚本来控制自己的电脑,解放自己的双手!

2、准备好了吗?PowerShell·

2.1 粗略介绍一下 PowerShell 与 bash 的区别与联系·

现如今 Windows 10 平台的 PowerShell 是 5.0 版本。支持 cmdlet. 所谓的 cmdlet 就是相当于微软 .Net 平台的一套小程序,命名为 Verb-Noun. 举个例子说明一下什么是 cmdlet,你在 UNIX 上输入命令创建一个空的文件夹:

1
2
#!/bin/bash
mkdir Test_dir

在 Windows Powershell 里面就有对应的 cmdlet:

1
2
# 创建一个名为 Test_dir 的文件夹
New-Item -ItemType Directory Test_dir

UNIX 这里面的 mkdir 就是一个小程序,你确实可以在 UNIX 上找到一个名为 mkdir 的可执行程序。但是 Windows 却不这么认为,Windows 认为用户可能误删某些小程序,导致你无法再正常使用 Windows 的 Powershell,于是微软的工程师,直接把需要用到的“小程序”集成在一起,禁止你直接访问、删改。

bash 是支持管道的,一个进程的输出,可以当作另一个进程的输入。换句话说,Linux/UNIX 是一个文本控件,一切皆文本,文本字节流是这个空间里的对象。

1
Get-PSDrive | ?{$_.Free -gt 1} | %{$Count = 0; Write-Host "";} { $_.Name + ": Used: " + "{0:N2}" -f ($_.Used/1gb) + " Free: " + "{0:N2}" -f ($_.free/1gb) + " Total: " + "{0:N2}" -f (($_.Used/1gb)+($_.Free/1gb)); $Count = $Count + $_.Free;}{Write-Host"";Write-Host "Total Free Space " ("{0:N2}" -f ($Count/1gb)) -backgroundcolor magenta}

Get-PSDrive 是一个小程序,也就是 Power Shell 里的 cmdlet. 上述命令很复杂,你可以通过视频进行学习。上述的文件写进 bat 脚本里,双击脚本运行,会得到一个类似的输出:

1
2
3
4
5
6
7
8
9
10
11
C: Used: 138.99 Free: 98.85 Total: 237.84
D: Used: 262.06 Free: 110.55 Total: 372.61
E: Used: 0.16 Free: 465.60 Total: 465.76
F: Used: 1,141.78 Free: 1,652.62 Total: 2,794.39
G: Used: 0.23 Free: 2,794.16 Total: 2,794.39
H: Used: 7.27 Free: 3,718.73 Total: 3,726.01
I: Used: 0.21 Free: 1,862.78 Total: 1,862.98
J: Used: 0.18 Free: 931.34 Total: 931.51
K: Used: 0.18 Free: 931.33 Total: 931.51

Total Free Space 12,565.97

cmdlet 约等于 UNIX 里 /bin 下面的小程序,只是你在文件浏览器里找不到它而已。除此之外,PowerShell 的使用,与 bash 差不多(我可不是说两者的语法差不多!)。

2.2 高傲的微软向 UNIX 世界屈服了吗?·

微软绝不是因为“他们有,所以我们也要有!”而创立的 PowerShell.

微软主要是因为 Windows Server 的管理问题而开发了 PowerShell 这个东西。所以从这里你也应该看出来了,微软相当于间接承认,没有 shell 的一个操作系统很难用

如果把 .Net 平台提供的开发 API 称为生肉的话,那么 PowerShell 就是经过烹调的熟肉。虽然生肉不好下嘴,但是你可以经过自己的烹调,获得最大的自由度。熟肉虽然好吃,但是你只能换个花样切一切再吃,没有什么自由度,想换个口味?几乎没可能。

三、PowerShell 好用吗·

很好用。

之前我一直对微软的 Windows 系统的开发能力很怀疑,我有个 MacBook Pro 15,特意配了 32GB 内存来搞开发,用起来很爽。但是哪怕我的 PC 机配置很强大,我也很不想用它来开发,我一般都是再 WSL 里运行我在 Mac 上写好的程序。但是最近和小伙伴们聊起来,大家对 PowerShell 还是赞不绝口的。

所以我承认,我对微软有偏见了。

如果你没有对一个系统做深入了解,你就不能武断地认为这个系统很难用。一眼看上去就很美,大概率是很美;一眼看上去不好用,大概率是因为你不够了解(**比如 Vim **)。

最后谈谈 PowerShell 哪些地方好用吧:

3.1 良好的自动补全功能·

不得不承认,PowerShell 的自动补全非常好用,可以忽略大小写进行循环匹配,bash 的匹配,如果出现前缀对应着多个可能的命令,就会列出来让你选择(除非用插件),但是 PowerShell 可以随着你按 TAB 进行自动匹配下一个可能的选项。这点仁者见仁智者见智吧,Power Shell 如果提示太多一时找不到,还得删掉已经提示的,然后重新输入,这点也很烦人。

不过,总体来说很优秀。

3.2 对于管道支持良好·

这一点配合 Power Shell 的面向对象特性特别有用。喜欢的自己钻研的时候注意一下。

3.3 支持环境变量·

1
2
3
4
PS C:\Users\newton> $env:PATH
C:\Program Files\PowerShell\7-preview;C:\Program Files\Python38\Scripts\;C:\Program Files\Python38\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Microsoft VS Code\bin;C:\Program Files\Git\cmd;C:\Program Files\dotnet\;C:\Program Files\MacType;C:\Program Files\Polyspace\R2020a\runtime\win64;C:\Program Files\Polyspace\R2020a\bin;C:\Program Files\Polyspace\R2020a\polyspace\bin;C:\Program Files (x86)\Wolfram Research\WolframScript\;C:\Program Files\PowerShell\7-preview\preview;C:\texlive\2020\bin\win32;C:\Users\newton\AppData\Local\Microsoft\WindowsApps;D:\Users\newton\Documents\Softwares\software_windows\download\m3u8DL;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\Llvm\bin;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\bin\Hostx64\x64
PS C:\Users\newton>

3.4 可以发挥 .Net 平台的巨大优势·

结合 Office,C#,非常好用。

结束语·

如果不是对 Linux 有着绝对依赖,即你知道自己哪些需求绝对离不开 Linux,那么不妨试试 Powershell,这个真的很不错。微软敢以 Power 之名,必然是有着相当的自信。