Linux 101:讓你的Shell更強大
在我們的關于 shell 基礎的指導下,得到一個更靈活,功能更強大且多彩的命令行界面。
為何要這樣做?
- 使得在 shell 提示符下過得更輕松,高效
- 在失去連接后,恢復先前的會話
- Stop pushing around that fiddly rodent!
bash1
這是我的命令行提示符的設置。對于這個小的終端窗口來說,這或許有些長。但你可以根據你的喜好來調整它。
作為一個 Linux 用戶,你可能熟悉 shell (又名為命令行)。 或許你需要時不時的打開終端來完成那些不能在 GUI 下處理的必要任務,抑或是因為你處在一個將窗口鋪滿桌面的環境中,而 shell 是你與你的 linux 機器交互的主要方式。
在上面那些情況下,你可能正在使用你所使用的發行版本自帶的 Bash 配置。 盡管對于大多數的任務而言,它足夠好了,但它可以更加強大。 在本教程中,我們將向你展示如何使得你的 shell 提供更多有用信息、更加實用且更適合工作。我們將對提示符進行自定義,讓它比默認情況下提供更好的反饋,并向你展示如何使用炫酷的 tmux
工具來管理會話并同時運行多個程序。 并且,為了讓眼睛舒服一點,我們還將關注配色方案。那么,進擊吧,少女!
讓提示符更美妙
大多數的發行版本配置有一個非常簡單的提示符,它們大多向你展示了一些基本信息, 但提示符可以為你提供更多的內容。例如,在 Debian 7 下,默認的提示符是這樣的:
mike@somebox:~$
上面的提示符展示出了用戶、主機名、當前目錄和賬戶類型符號(假如你切換到 root 賬戶, $ 會變為 #)。 那這些信息是在哪里存儲的呢? 答案是:在 PS1 環境變量中。 假如你鍵入 echo $PS1
, 你將會在這個命令的輸出字符串的最后有如下的字符:
\u@\h:\w$
這看起來有一些丑陋,并在瞥見它的第一眼時,你可能會開始尖叫,認為它是令人恐懼的正則表達式,但我們不打算用這些復雜的字符來煎熬我們的大腦。這不是正則表達式,這里的斜杠是轉義序列,它告訴提示符進行一些特別的處理。 例如,上面的 u 部分,告訴提示符展示用戶名, 而 w 則展示工作路徑。
下面是一些你可以在提示符中用到的字符的列表:
- d 當前的日期
- h 主機名
- n 代表換行的字符
- A 當前的時間 (HH:MM)
- u 當前的用戶
- w (小寫) 整個工作路徑的全稱
- W (大寫) 工作路徑的簡短名稱
- $ 一個提示符號,對于 root 用戶為 # 號
- ! 當前命令在 shell 歷史記錄中的序號
下面解釋 w 和 W 選項的區別:對于前者,你將看到你所在的工作路徑的完整地址,(例如 /usr/local/bin),而對于后者, 它則只顯示 bin 這一部分。
現在,我們該怎樣改變提示符呢? 你需要更改 PS1 環境變量的內容,試試下面這個:
export PS1="I am \u and it is \A $"
現在,你的提示符將會像下面這樣:
I am mike and it is 11:26 $
從這個例子出發,你就可以按照你的想法來試驗一下上面列出的其他轉義序列。 但等等 – 當你登出后,你的這些努力都將消失,因為在你每次打開終端時,PS1 環境變量的值都會被重置。解決這個問題的最簡單方式是打開 .bashrc 配置文件(在你的家目錄下) 并在這個文件的最下方添加上完整的 export
命令。在每次你啟動一個新的 shell 會話時,這個 .bashrc 會被 Bash
讀取, 所以你的加強的提示符就可以一直出現。你還可以使用額外的顏色來裝扮提示符。剛開始,這將有點棘手,因為你必須使用一些相當奇怪的轉義序列,但結果是非常漂亮的。 將下面的字符添加到你的 PS1字符串中的某個位置,最終這將把文本變為紅色:
\[\e[31m\]
你可以將這里的 31 更改為其他的數字來獲得不同的顏色:
- 30 黑色
- 32 綠色
- 33 黃色
- 34 藍色
- 35 洋紅色
- 36 青色
- 37 白色
所以,讓我們使用先前看到的轉義序列和顏色來創造一個提示符,以此來結束這一小節的內容。深吸一口氣,彎曲你的手指,然后鍵入下面這只“野獸”:
export PS1="(\!) \[\e[31m\] \[\A\] \[\e[32m\]\u@\h \[\e[34m\]\w \[\e[30m\]$"
上面的命令提供了一個 Bash 命令歷史序號、當前的時間、彩色的用戶或主機名組合、以及工作路徑。假如你“野心勃勃”,利用一些驚人的組合,你還可以更改提示符的背景色和前景色。非常有用的 Arch wiki 有一個關于顏色代碼的完整列表:http://tinyurl.com/3gvz4ec。
Shell 精要
假如你是一個徹底的 Linux 新手并第一次閱讀這份雜志,或許你會發覺閱讀這些教程有些吃力。 所以這里有一些基礎知識來讓你熟悉一些 shell。 通常在你的菜單中, shell 指的是 Terminal、 XTerm 或 Konsole, 當你啟動它后, 最為實用的命令有這些:
ls (列出文件名); cp one.txt two.txt (復制文件); rm file.txt (移除文件); mv old.txt new.txt (移動或重命名文件);
cd /some/directory (改變目錄); cd .. (回到上級目錄); ./program (在當前目錄下運行一個程序); ls > list.txt (重定向輸出到一個文件)。
幾乎每個命令都有一個手冊頁用來解釋其選項(例如 man ls – 按 Q 來退出)。在那里,你可以知曉命令的選項,這樣你就知道 ls -la 展示一個詳細的列表,其中也列出了隱藏文件, 并且在鍵入一個文件或目錄的名字的一部分后, 可以使用 Tab 鍵來自動補全。
#p#
Tmux: 針對 shell 的窗口管理器
在文本模式的環境中使用一個窗口管理器 – 這聽起來有點不可思議,是吧? 然而,你應該記得當 Web 瀏覽器第一次實現分頁瀏覽的時候吧? 在當時, 這是在可用性上的一個重大進步,它減少了桌面任務欄的雜亂無章和繁多的窗口列表。 對于你的瀏覽器來說,你只需要一個按鈕便可以在瀏覽器中切換到你打開的每個單獨網站, 而不是針對每個網站都有一個任務欄或導航圖標。這個功能非常有意義。
若有時你同時運行著幾個虛擬終端,你便會遇到相似的情況; 在這些終端之間跳轉,或每次在任務欄或窗口列表中找到你所需要的那一個終端,都可能會讓你覺得麻煩。 擁有一個文本模式的窗口管理器不僅可以讓你像在同一個終端窗口中運行多個 shell 會話,而且你甚至還可以將這些窗口排列在一起。
另外,這樣還有另一個好處:可以將這些窗口進行分離和重新連接。想要看看這是如何運行的最好方式是自己嘗試一下。在一個終端窗口中,輸入 screen
(在大多數發行版本中,它已經默認安裝了或者可以在軟件包倉庫中找到)。 某些歡迎的文字將會出現 – 只需敲擊 Enter 鍵這些文字就會消失。 現在運行一個交互式的文本模式的程序,例如 nano
, 并關閉這個終端窗口。
在一個正常的 shell 對話中, 關閉窗口將會終止所有在該終端中運行的進程 – 所以剛才的 Nano 編輯對話也就被終止了, 但對于 screen 來說,并不是這樣的。打開一個新的終端并輸入如下命令:
screen -r
瞧,你剛開打開的 Nano 會話又回來了!
當剛才你運行 screen 時, 它會創建了一個新的獨立的 shell 會話, 它不與某個特定的終端窗口綁定在一起,所以可以在后面被分離并重新連接(即 -r 選項)。
當你正使用 SSH 去連接另一臺機器并做著某些工作時, 但并不想因為一個脆弱的連接而影響你的進度,這個方法尤其有用。假如你在一個 screen 會話中做著某些工作,并且你的連接突然中斷了(或者你的筆記本沒電了,又或者你的電腦報廢了——不是這么悲催吧),你只需重新連接或給電腦充電或重新買一臺電腦,接著運行 screen -r 來重新連接到遠程的電腦,并在剛才掉線的地方接著開始。
現在,我們都一直在討論 GNU 的 screen,但這個小節的標題提到的是 tmux。 實質上, tmux (terminal multiplexer) 就像是 screen 的一個進階版本,帶有許多有用的額外功能,所以現在我們開始關注 tmux。 某些發行版本默認包含了 tmux; 在其他的發行版本上,通常只需要一個 apt-get、 yum install 或 pacman -S 命令便可以安裝它。
一旦你安裝了它過后,鍵入 tmux 來啟動它。接著你將注意到,在終端窗口的底部有一條綠色的信息欄,它非常像傳統的窗口管理器中的任務欄: 上面顯示著一個運行著的程序的列表、機器的主機名、當前時間和日期。 現在運行一個程序,同樣以 Nano 為例, 敲擊 Ctrl+B 后接著按 C 鍵, 這將在 tmux 會話中創建一個新的窗口,你便可以在終端的底部的任務欄中看到如下的信息:
0:nano- 1:bash*
每一個窗口都有一個數字,當前呈現的程序被一個星號所標記。 Ctrl+B 是與 tmux 交互的標準方式, 所以若你敲擊這個按鍵組合并帶上一個窗口序號, 那么就會切換到對應的那個窗口。你也可以使用 Ctrl+B 再加上 N 或 P 來分別切換到下一個或上一個窗口 – 或者使用 Ctrl+B 加上 L 來在最近使用的兩個窗口之間來進行切換(有點類似于桌面中的經典的 Alt+Tab 組合鍵的效果)。 若需要知道窗口列表,使用 Ctrl+B 再加上 W。
目前為止,一切都還好:現在你可以在一個單獨的終端窗口中運行多個程序,避免混亂(尤其是當你經常與同一個遠程主機保持多個 SSH 連接時)。 當想同時看兩個程序又該怎么辦呢?
針對這種情況, 可以使用 tmux 中的窗格。 敲擊 Ctrl+B 再加上 % , 則當前窗口將分為兩個部分:一個在左一個在右。你可以使用 Ctrl+B 再加上 O 來在這兩個部分之間切換。 這尤其在你想同時看兩個東西時非常實用, – 例如一個窗格看指導手冊,另一個窗格里用編輯器看一個配置文件。
有時,你想對一個單獨的窗格進行縮放,而這需要一定的技巧。 首先你需要敲擊 Ctrl+B 再加上一個 :(冒號),這將使得位于底部的 tmux 欄變為深橙色。 現在,你進入了命令模式,在這里你可以輸入命令來操作 tmux。 輸入 resize-pane -R 來使當前窗格向右移動一個字符的間距, 或使用 -L 來向左移動。 對于一個簡單的操作,這些命令似乎有些長,但請注意,在 tmux 的命令模式(前面提到的一個分號開始的模式)下,可以使用 Tab 鍵來補全命令。 另外需要提及的是, tmux 同樣也有一個命令歷史記錄,所以若你想重復剛才的縮放操作,可以先敲擊 Ctrl+B 再跟上一個分號,并使用向上的箭頭來取回剛才輸入的命令。
最后,讓我們看一下分離和重新連接 - 即我們剛才介紹的 screen 的特色功能。 在 tmux 中,敲擊 Ctrl+B 再加上 D 來從當前的終端窗口中分離當前的 tmux 會話。這使得這個會話的一切工作都在后臺中運行、使用 tmux a
可以再重新連接到剛才的會話。但若你同時有多個 tmux 會話在運行時,又該怎么辦呢? 我們可以使用下面的命令來列出它們:
tmux ls
這個命令將為每個會話分配一個序號; 假如你想重新連接到會話 1, 可以使用 tmux a -t 1
. tmux 是可以高度定制的,你可以自定義按鍵綁定并更改配色方案, 所以一旦你適應了它的主要功能,請鉆研指導手冊以了解更多的內容。
tmux
上圖中, tmux 開啟了兩個窗格: 左邊是 Vim 正在編輯一個配置文件,而右邊則展示著指導手冊頁。
Zsh: 另一個 shell
選擇是好的,但標準同樣重要。 你要知道幾乎每個主流的 Linux 發行版本都默認使用 Bash shell – 盡管還存在其他的 shell。 Bash 為你提供了一個 shell 能夠給你提供的幾乎任何功能,包括命令歷史記錄,文件名補全和許多腳本編程的能力。它成熟、可靠并文檔豐富 – 但它不是你唯一的選擇。
許多高級用戶熱衷于 Zsh, 即 Z shell。 這是 Bash 的一個替代品并提供了 Bash 的幾乎所有功能,另外還提供了一些額外的功能。 例如, 在 Zsh 中,你輸入 ls ,并敲擊 Tab 鍵可以得到 ls 可用的各種不同選項的一個大致描述。 而不需要再打開 man page 了!
Zsh 還支持其他強大的自動補全功能: 例如,輸入 cd /u/lo/bi 再敲擊 Tab 鍵, 則完整的路徑名 /usr/local/bin 就會出現(這里假設沒有其他的路徑包含 u, lo 和 bi 等字符)。 或者只輸入 cd 再跟上 Tab 鍵,則你將看到著色后的路徑名的列表 – 這比 Bash 給出的簡單的結果好看得多。
Zsh 在大多數的主要發行版本上都可以得到了; 安裝它后并輸入 zsh 便可啟動它。 要將你的默認 shell 從 Bash 改為 Zsh, 可以使用 chsh 命令。 若需了解更多的信息,請訪問 www.zsh.org。
“未來”的終端
你或許會好奇為什么包含你的命令行提示符的應用被叫做終端。 這需要追溯到 Unix 的早期, 那時人們一般工作在一個多用戶的機器上,這個巨大的電腦主機將占據一座建筑中的一個房間,人們通過某些線路,使用屏幕和鍵盤來連接到這個主機, 這些終端機通常被稱為“啞終端”, 因為它們不能靠自己做任何重要的執行任務 – 它們只展示通過線路從主機傳來的信息,并輸送回從鍵盤的敲擊中得到的輸入信息。
今天,我們在自己的機器上執行幾乎所有的實際操作,所以我們的電腦不是傳統意義下的終端,這就是為什么諸如 XTerm、 Gnome Terminal、 Konsole 等程序被稱為“終端模擬器” 的原因 – 他們提供了同昔日的物理終端一樣的功能。事實上,在許多方面它們并沒有改變多少。誠然,現在我們有了反鋸齒字體,更好的顏色和點擊網址的能力,但總的來 說,幾十年來我們一直以同樣的方式在工作。
所以某些程序員正嘗試改變這個狀況。 Terminology (http://tinyurl.com/osopjv9), 它來自于超級時髦的 Enlightenment 窗口管理器背后的團隊,旨在讓終端步入到 21 世紀,例如帶有在線媒體顯示功能。你可以在一個充滿圖片的目錄里輸入 ls 命令,便可以看到它們的縮略圖,或甚至可以直接在你的終端里播放視頻。 這使得一個終端有點類似于一個文件管理器,意味著你可以快速地檢查媒體文件的內容而不必用另一個應用來打開它們。
接著還有 Xiki (www.xiki.org),它自身的描述為“命令的革新”。它就像是一個傳統的 shell、一個 GUI 和一個 wiki 之間的過渡;你可以在任何地方輸入命令,并在后面將它們的輸出存儲為筆記以作為參考,并可以創建非常強大的自定義命令。用幾句話是很能描述它的,所以作者 們已經創作了一個視頻來展示它的潛力是多么的巨大(請看 Xiki 網站的截屏視頻部分)。
并且 Xiki 絕不是那種在幾個月之內就消亡的曇花一現的項目,作者們成功地進行了一次 Kickstarter 眾籌,在七月底已募集到超過 $84,000。 是的,你沒有看錯 – $84K 來支持一個終端模擬器。這可能是最不尋常的集資活動了,因為某些瘋狂的家伙已經決定開始創辦它們自己的 Linux 雜志 ......
下一代終端
許多命令行和基于文本的程序在功能上與它們的 GUI 程序是相同的,并且常常更加快速和高效。我們的推薦有: Irssi (IRC 客戶端); Mutt (mail 客戶端); rTorrent (BitTorrent); Ranger (文件管理器); htop (進程監視器)。 若給定在終端的限制下來進行 Web 瀏覽, Elinks 確實做的很好,并且對于閱讀那些以文字為主的網站例如 Wikipedia 來說。它非常實用。
微調配色方案
在《Linux Voice》雜志社中,我們并不迷戀那些養眼的東西,但當你每天花費幾個小時盯著屏幕看東西時,我們確實認識到美學的重要性。我們中的許多人都喜歡調整我 們的桌面和窗口管理器來達到完美的效果,調整陰影效果、擺弄不同的配色方案,直到我們 100% 的滿意(然后出于習慣,擺弄更多的東西)。
但我們傾向于忽視終端窗口,它理應也獲得我們的喜愛,并且在 http://ciembor.github.io/4bit 你將看到一個極其棒的配色方案設計器,對于所有受歡迎的終端模擬器(XTerm, Gnome Terminal, Konsole 和 Xfce4 Terminal 等都是支持的應用。),它可以輸出其設定。移動滑塊直到你看到配色方案最佳, 然后點擊位于該頁面右上角的
得到方案
按鈕。相似的,假如你在一個文本編輯器,如 Vim 或 Emacs 上花費了很多的時間,使用一個精心設計的調色板也是非常值得的。 Solarized http://ethanschoonover.com/solarized 是一個卓越的方案,它不僅漂亮,而且因追求最大的可用性而設計,在其背后有著大量的研究和測試。