Zsh 入門
Z-shell(Zsh)是一種 Bourne 式的互動式 POSIX shell,以其豐富的創新功能而著稱。Z-Shell 用戶經常會提及它的許多便利之處,讚譽它對效率的提高和豐富的自定義支持。
如果你剛接觸 Linux 或 Unix,但你的經驗足以讓你可以打開終端並運行一些命令的話,那麼你可能使用的就是 Bash shell。Bash 可能是最具有代表意義的自由軟體 shell,部分是因為它具有的先進的功能,部分是因為它是大多數流行的 Linux 和 Unix 操作系統上的默認 shell。但是,隨著使用的次數越多,你可能會開始發現一些細節可能能夠做的更好。開源有一個眾所周知的地方,那就是選擇。所以,許多人選擇從 Bash 「畢業」到 Z。
Zsh 介紹
Shell 只是操作系統的介面。互動式 shell 程序允許你通過稱為標準輸入(stdin)的某個東西鍵入命令,並通過標準輸出(stdout)和標準錯誤(stderr)獲取輸出。有很多種 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每個都有其開發者所認為最適合於 Shell 的功能。而這些功能的好壞,則取決於最終用戶。
Zsh 具有互動式製表符補全、自動文件搜索、支持正則表達式、用於定義命令範圍的高級速記符,以及豐富的主題引擎等功能。這些功能也包含在你所熟悉的其它 Bourne 式 shell 環境中,這意味著,如果你已經了解並喜歡 Bash,那麼你也會熟悉 Zsh,除此以外,它還有更多的功能。你可能會認為它是一種 Bash++。
安裝 Zsh
用你的包管理器安裝 Zsh。
在 Fedora、RHEL 和 CentOS 上:
$ sudo dnf install zsh
在 Ubuntu 和 Debian 上:
$ sudo apt install zsh
在 MacOS 上你可以使用 MacPorts 安裝它:
$ sudo port install zsh
或使用 Homebrew:
$ brew install zsh
在 Windows 上也可以運行 Zsh,但是只能在 Linux 層或類似 Linux 的層之上運行,例如 Windows 的 Linux 子系統(WSL)或 Cygwin。這類安裝超出了本文的範圍,因此請參考微軟的文檔。
設置 Zsh
Zsh 不是終端模擬器。它是在終端模擬器中運行的 shell。因此,要啟動 Zsh,必須首先啟動一個終端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm2、rxvt 或你喜歡的其它終端。然後,你可以通過鍵入以下命令啟動 Zsh:
$ zsh
首次啟動 Zsh 時,會要求你選擇一些配置選項。這些都可以在以後更改,因此請按 1
繼續。
This is the Z Shell configuration function for new users, zsh-newuser-install.
(q) Quit and do nothing.
(0) Exit, creating the file ~/.zshrc
(1) Continue to the main menu.
偏好設置分為四類,因此請從頂部開始。
- 第一個類使你可以選擇在 shell 歷史記錄文件中保留多少個命令。默認情況下,它設置為 1,000 行。
- Zsh 補全是其最令人興奮的功能之一。為了簡單起見,請考慮使用其默認選項激活它,直到你習慣了它的工作方式。按
1
使用默認選項,按2
手動設置選項。 - 選擇 Emacs 式鍵綁定或 Vi 式鍵綁定。Bash 使用 Emacs 式綁定,因此你可能已經習慣了。
- 最後,你可以了解(以及設置或取消設置)Zsh 的一些精妙的功能。例如,當你提供不帶命令的非可執行路徑時,可以通過讓 Zsh 來改變目錄而無需你使用
cd
命令。要激活這些額外選項之一,請輸入選項號並輸入s
進行設置。請嘗試打開所有選項以獲得完整的 Zsh 體驗。你可以稍後通過編輯~/.zshrc
取消設置它們。
要完成配置,請按 0
。
使用 Zsh
剛開始,Zsh 的使用感受就像使用 Bash 一樣,這無疑是其眾多功能之一。例如,Bash 和 Tcsh 之間就存在嚴重的差異,因此如果你必須在工作中或在伺服器上使用 Bash,而 Zsh 就可以在家裡輕鬆嘗試和使用,這樣在 Bash 和 Zsh 之間輕鬆切換就是一種便利。
在 Zsh 中改變目錄
正是這些微小的差異使 Zsh 變得好用。首先,嘗試在沒有 cd
命令的情況下,將目錄更改為 Documents
文件夾。簡直太棒了,難以置信。如果你輸入的是目錄路徑而沒有進一步的指令,Zsh 會更改為該目錄:
% Documents
% pwd
/home/seth/Documents
而這會在 Bash 或任何其他普通 shell 中導致錯誤。但是 Zsh 卻根本不是普通的 shell,而這僅僅才是開始。
在 Zsh 中搜索
當你想使用普通 shell 程序查找文件時,可以使用 find
或 locate
命令。最起碼,你可以使用 ls -R
來遞歸地列出一組目錄。Zsh 內置有允許它在當前目錄或任何其他子目錄中查找文件的功能。
例如,假設你有兩個名為 foo.txt
的文件。一個位於你的當前目錄中,另一個位於名為 foo
的子目錄中。在 Bash Shell 中,你可以使用以下命令列出當前目錄中的文件:
$ ls
foo.txt
你可以通過明確指明子目錄的路徑來列出另一個目錄:
$ ls foo
foo.txt
要同時列出這兩者,你必須使用 -R
開關,並結合使用 grep
:
$ ls -R | grep foo.txt
foo.txt
foo.txt
但是在 Zsh 中,你可以使用 **
速記符號:
% ls **/foo.txt
foo.txt
foo.txt
你可以在任何命令中使用此語法,而不僅限於 ls
。想像一下在這樣的場景中提高的效率:將特定文件類型從一組目錄中移動到單個位置、將文本片段串聯到一個文件中,或對日誌進行抽取。
使用 Zsh 的製表符補全
製表符補全是 Bash 和其他一些 Shell 中的高級用戶功能,它變得司空見慣,席捲了 Unix 世界。Unix 用戶不再需要在輸入冗長而乏味的路徑時使用通配符(例如輸入 /h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v
,比輸入 /home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv
要容易得多)。相反,他們只要輸入足夠的唯一字元串即可按 Tab
鍵。例如,如果你知道在系統的根目錄下只有一個以 h
開頭的目錄,則可以鍵入 /h
,然後單擊 Tab
。快速、簡單、高效。它還會確認路徑存在;如果 Tab
無法完成任何操作,則說明你在錯誤的位置或輸入了錯誤的路徑部分。
但是,如果你有許多目錄有五個或更多相同的首字母,Tab
會堅決拒絕進行補全。儘管在大多數現代終端中,它將(至少會)顯示阻止其進行猜測你的意思的文件,但通常需要按兩次 Tab
鍵才能顯示它們。因此,製表符補全通常會變成來回按下鍵盤上字母和製表符,以至於你好像在接受鋼琴獨奏會的訓練。
Zsh 通過循環可能的補全來解決這個小問題。如果鍵入 ls ~/D
並按 Tab
,則 Zsh 首先使用 Documents
來完成命令;如果再次按 Tab
,它將提供 Downloads
,依此類推,直到找到所需的選項。
Zsh 中的通配符
在 Zsh 中,通配符的行為不同於 Bash 中用戶所習慣的行為。首先,可以對其進行修改。例如,如果要列出當前目錄中的所有文件夾,則可以使用修改後的通配符:
% ls
dir0 dir1 dir2 file0 file1
% ls *(/)
dir0 dir1 dir2
在此示例中,(/)
限定了通配符的結果,因此 Zsh 僅顯示目錄。要僅列出文件,請使用 (.)
。要列出符號鏈接,請使用 (@)
。要列出可執行文件,請使用 (*)
。
% ls ~/bin/*(*)
fop exify tt
Zsh 不僅僅知道文件類型。它也可以使用相同的通配符修飾符約定根據修改時間列出。例如,如果要查找在過去八個小時內修改的文件,請使用 mh
修飾符(即 「modified hours」 的縮寫)和小時的負整數:
% ls ~/Documents/*(mh-8)
cal.org game.org home.org
要查找超過(例如)兩天前修改過的文件,修飾符更改為 md
(即 「modified day」 的縮寫),並帶上天數的正整數:
% ls ~/Documents/*(+2)
holiday.org
通配符修飾符和限定符還可以做很多事情,因此,請閱讀 Zsh 手冊頁,以獲取全部詳細信息。
通配符的副作用
要像在 Bash 中使用通配符一樣使用它,有時必須在 Zsh 中對通配符進行轉義。例如,如果要在 Bash 中將某些文件複製到伺服器上,則可以使用如下通配符:
$ scp IMG_*.JPG seth@example.com:~/www/ph*/*19/09/14
這在 Bash 中有效,但是在 Zsh 中會返回錯誤,因為它在發出 scp
命令之前嘗試在遠程端擴展該變數(通配符)。為避免這種情況,必須轉義遠程變數(通配符):
% scp IMG_*.JPG seth@example.com:~/www/ph*/*19/09/14
當你切換到新的 shell 時,這些小異常可能會使你感到沮喪。使用 Zsh 時會遇到的問題不多(體驗過 Zsh 後切換回 Bash 的可能遇到更多),但是當它們發生時,請保持鎮定且坦率。嚴格遵守 POSIX 的情況很少會出錯,但是如果失敗了,請查找問題以解決並繼續。對於許多在工作中困在一個 shell 上而在家中困在另一個 shell 上的用戶來說,hyperpolyglot.org 已被證明其是無價的。
在我的下一篇 Zsh 文章中,我將向你展示如何安裝主題和插件以定製你的 Z-Shell 甚至 Z-ier。
via: https://opensource.com/article/19/9/getting-started-zsh
作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive