
萬事萬物,有始有終。直從萌芽拔,高自毫末始。
所謂的 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 之名,必然是有著相當的自信。