万事万物,有始有终。直从萌芽拔,高自毫末始。
所谓的 Shell,无非是应用程序与操作系统内核进行交互的一个中间程序而已。我本人玩电脑也有很久一阵子了,最开始接触到的就是Windows 7 操作系统,当时 Windows 7 上市不久,我在那台 20 英寸的液晶显示器上看了很多 PC 的知识。但是我第一次接触Shell,却是在 Linux上。
Linux 上最常用的是 Bash,这是一个对于 Bourne Shell 的再造版,完全免费、开源,而且很好用。而 Linux 上的 zsh 也不错,而且很多提示功能非常贴心。就这么一个好用的 shell 程序,自然身受很多程序员的喜爱。玩电脑怎么能不搞点自动化呢?
想想有哪些东西需要自动化?我列举几个:
- 写了一个程序,要用来编译、测试、测试完再清理编译的产物,这个时候需要一个自动化的操作
- 用 LaTeX 写了一篇论文或者文章,希望能自动进行编译,然后自动清理产生的 aux、log 等中间产物,只留下编译产生的 PDF 文件
- 喜欢一个网页或者博客,希望及时收到这个网页的更新,这个时候你需要一个程序,自动地每隔几秒、几分钟、数小时发起一次 HTTP 请求,然后获得页面中相应部分的更新情况(比如淘宝页面,价格是否变化了?)
- 自己的系统装了很多软件,希望能够批量进行更新情况检查,一旦有部分软件出了新版,就自动联网更新。
- ...
上述的几个情况比较特殊,但是确确实实贴近我们的生活。最初的 Windows 系统,并不支持这种内建的自动化操作,你能想到的也就是 cmd 命令行。而这个命令行确实非常难用,让一些追求软件美感的人望而却步(嗤之以鼻)。
1、何以 UNIX/Linux
UNIX 是从实验室里走出来的操作系统,小巧、高效、简洁、开放。而 Linux 作为 UNIX 的净室再现,也相应地具有了 UNIX 的各种优点,也兼容 UNIX 系统的很多程序。等到把 GCC 移植到 Linux 之后,Linux 的增长曲线开始发力,因为一旦有了某个平台的编译器,我们只需要把其他平台的源代码拿过来编译一遍,就得到了适用于新平台的软件。当然,前提是新平台符合 POSIX 标准。
那么为何 bash 在 UNIX 世界里这么受欢迎呢?我认为有以下几个原因。
- 使用者生活在一个自由的环境里
- 使用者的知识水平比较高,众所周知,BSD 版本的 UNIX 是在伯克利大学流传开来的,那里的师生什么水平、什么审美,相信大家有目共睹
- UNIX 的伪终端非常好用,以 macOS 为例,你可以直接在 Terminal 里面,用键盘复制、粘贴,而其他诸如 Linux 自带的终端也很好用
- Bash 的开发很有趣,相关的程序很给力,比如 GNU 软件,awk、perl、sed 等程序,非常适合命令行下操作字符串
- 很有美感
以上种种原因,使得 bash 脚本在 UNIX 世界里广受欢迎,你只要稍加练习,就会爱上这门语言。
但是,PC 装机份额最大的 Windows 用户,在这一方面却始终处于水深火热之中。怀抱着丑陋的 cmd,用着蹩脚的复制、粘贴操作。更重要的是,很多 Windows 用户并不知道竟然可以自己写脚本来控制自己的电脑,解放自己的双手!
2、准备好了吗?PowerShell
2.1 粗略介绍一下 PowerShell 与 bash 的区别与联系
现如今 Windows 10 平台的 PowerShell 是 5.0 版本。支持 cmdlet。所谓的 cmdlet 就是相当于微软 .Net 平台的一套小程序,命名为 Verb-Noun
。举个例子说明一下什么是 cmdlet,你在 UNIX 上输入命令创建一个空的文件夹:
#!/bin/bash
mkdir Test_dir
在 Windows Powershell 里面就有对应的 cmdlet:
# 创建一个名为 Test_dir 的文件夹
New-Item -ItemType Directory Test_dir
UNIX 这里面的 mkdir
就是一个小程序,你确实可以在 UNIX 上找到一个名为 mkdir
的可执行程序。但是 Windows 却不这么认为,Windows 认为用户可能误删某些小程序,导致你无法再正常使用 Windows 的 Powershell,于是微软的工程师,直接把需要用到的“小程序”集成在一起,禁止你直接访问、删改。
bash 是支持管道的,一个进程的输出,可以当作另一个进程的输入。换句话说,Linux/UNIX 是一个文本控件,一切皆文本,文本字节流是这个空间里的对象。
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 脚本里,双击脚本运行,会得到一个类似的输出:
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.51Total Free Space 12,565.97
cmdlet 约等于 UNIX 里 /bin 下面的小程序,只是你在文件浏览器里找不到它而已。除此之外,Power Shell的使用,与 bash 差不多(我可不是说两者的语法差不多!)。
2.2 高傲的微软向UNIX世界屈服了吗?
微软绝不是因为“他们有,所以我们也要有!”而创立的PowerShell。
微软主要是因为 Windows Server 的管理问题而开发了 Power Shell 这个东西。所以从这里你也应该看出来了,微软相当于间接承认,没有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 支持环境变量
PS C:Usersnewton> $env:PATH
C:Program FilesPowerShell7-preview;C:Program FilesPython38Scripts;C:Program FilesPython38;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:WindowsSystem32OpenSSH;C:Program FilesMicrosoft VS Codebin;C:Program FilesGitcmd;C:Program Filesdotnet;C:Program FilesMacType;C:Program FilesPolyspaceR2020aruntimewin64;C:Program FilesPolyspaceR2020abin;C:Program FilesPolyspaceR2020apolyspacebin;C:Program Files (x86)Wolfram ResearchWolframScript;C:Program FilesPowerShell7-previewpreview;C:texlive2020binwin32;C:UsersnewtonAppDataLocalMicrosoftWindowsApps;D:UsersnewtonDocumentsSoftwaressoftware_windowsdownloadm3u8DL;C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsLlvmbin;C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.25.28610binHostx64x64
PS C:Usersnewton>
3.4 可以发挥 .Net 平台的巨大优势
结合 Office,C#,非常好用。
结束语
如果不是对 Linux 有着绝对依赖,即你知道自己哪些需求绝对离不开 Linux,那么不妨试试 Powershell,这个真的很不错。微软敢以 Power 之名,必然是有着相当的自信。