使用 Linux 最酷的事情之一就是隨著時間的推移,你可以不斷獲得新的知識。每天,你都可能會遇到一個新的實用工具,或者只是一個不太熟悉的奇技淫巧,但是卻非常有用。這些零碎的東西並不總是能夠改變生活,但是卻是專業知識的基礎。
即使是專家,也不可能事事皆知。無論你有多少經驗,可能總會有更多的東西需要你去學習。所以,在這兒我列出了七件關於 Linux 你可能不知道的事情。
一個查詢命令歷史的互動模式
你可能對 history
命令非常熟悉,它會讀取 bash 歷史,然後以編號列表的方式輸出到標準輸出(stdout
)。然而,如果你在 curl
命令的海洋裡尋找一個特定的連結(URL),那麼這個列表並不總是那麼容易閱讀的。
你還可以有另一個選擇,Linux 有一個互動式的反向搜尋可以幫助你解決這個問題。你可以通過快捷鍵 ctrl+r
啟動互動模式,然後進入一個互動提示中,它將會根據你提供的字串來向後搜尋 bash 歷史,你可以通過再次按下 ctrl+r
向後搜尋更老的命令,或者按下 ctrl+s
向前搜尋。
注意,ctrl+s
有時會與 XON/XOFF 流控制衝突,即 XON/XOFF 流控制也會使用該快捷鍵。你可以通過執行 stty -ixon
命令來禁用該快捷鍵。在你的個人電腦上,這通常是有用的,但是在禁用前,確保你不需要 XON/XOFF 。
Cron 不是安排任務的唯一方式
Cron 任務對於任何水平的系統管理員,無論是毫無經驗的初學者,還是經驗豐富的專家來說,都是非常有用的。但是,如果你需要安排一個一次性的任務,那麼 at
命令為你提供了一個快捷的方式來建立任務,從而你不需要接觸 crontab 。
at
命令的執行方式是在後面緊跟著你想要執行任務的執行時間。時間是靈活的,因為它支援許多時間格式。包括下面這些例子:
1 2 3 |
at 12:00 PM September 30 2017 at now + 1 hour at 9:00 AM tomorrow |
當你以帶引數的方式輸入 at
命令以後,將會提示你該命令將在你的 Linux 系統上執行。這可能是一個備份指令碼,一套維護任務,或者甚至是一個普通的 bash 命令。如果要結束任務,可以按 ctrl+d
。
另外,你可以使用 atq
命令檢視當前使用者的所有任務,或者使用 sudo atq
檢視所有使用者的任務。它將會展示出所有排定好的任務,並且每個任務都伴有一個 ID 。如果你想取消一個排定好的任務,可以使用 atrm
命令,並且以任務 ID 作為引數。
你可以按照功能搜尋命令,而不僅僅是通過名字
記住命令的名字非常困難,特別是對於初學者來說。幸運的是,Linux 附帶了一個通過名字和描述來搜尋 man 頁面的工具。
下次,如果你沒有記住你想要使用的工具的名稱,你可以嘗試使用 apropos
命令加上你想要乾的事情的描述。比如,apropos build filesystem
將會返回一系列名字和描述包括了 “build” 和 “filesystem” 單詞的工具。
apropos
命令接受一個或多個字串作為引數,但同時它也有其他引數,比如你可以使用 -r
引數,從而通過正規表示式來搜尋。
一個允許你來管理系統版本的替代系統
如果你曾進行過軟體開發,你就會明白跨專案管理不同版本的語言的支援的重要性。許多 Linux 發行版都有工具可以來處理不同的內建版本。
可執行檔案比如 java
往往符號連結到目錄 /etc/alternatives
下。反過來,該目錄會將符號連結儲存為二進位制檔案並提供一個管理這些連結的介面。Java 可能是替代系統最常管理的語言,但是,經過一些配置,它也可以作為其他應用程式替代品,比如 NVM 和 RVM (NVM 和 RVM 分別是 NodeJS 和 Ruby 的版本管理器)。
在基於 Debian 的系統中,你可以使用 update-alternatives
命令建立和管理這些連結。在 CentOS 中,這個工具就叫做 alternatives
。通過更改你的 alternatives 檔案中的連結,你便可以安裝一個語言的多個版本,並且在不同的情況下使用不同的二進位制。這個替代系統也提供了對任何你可能在命令列執行的程式的支援。
shred
命令是更加安全的刪除檔案方式
我們大多數時候總是使用 rm
命令來刪除檔案。但是檔案去哪兒了呢?真相是 rm
命令所做的事情並不是像你所想像的那樣,它僅僅刪除了檔案系統和硬碟上的資料的硬連結。硬碟上的資料依舊存在,直到被另一個應用重寫覆蓋。對於非常敏感的資料來說,這會帶來一個很大的安全隱患。
shred
命令是 rm
命令的升級版。當你使用 shred
命令刪除一個檔案之後,檔案中的資料會被多次隨機覆寫。甚至有一個選項可以在隨機覆寫之後對所有的資料進行清零。
如果你想安全的刪除一個檔案並且以零覆蓋,那麼可以使用下面的命令:
1 |
shred -u -z [file name] |
同時,你也可以使用 -n
選項和一個數字作為引數,從而指定在隨機覆蓋資料的時候迭代多少次。
通過自動更正來避免輸入很長的無效檔案路徑
有多少次,你輸入一個檔案的絕對路徑,然而卻看到“沒有該檔案或目錄”的訊息。任何人都會明白輸入一個很長的字串的痛苦。幸運的是,有一個很簡單的解決辦法。
內建的 shopt
命令允許你設定不同的選項來改變 shell 的行為。設定 cdspell
選項是避免輸入檔案路徑時一個字母出錯的頭痛的一個簡單方式。你可以通過執行 shopt -s cdspell
命令來啟用該選項。啟用該選項後,當你想要切換目錄時,會自動更正為最匹配的目錄。
Shell 選項是節省時間的一個好方法(更不用說減少麻煩),此外還有許許多多的其他選項。如果想檢視你的系統中所有選項的完整列表,可以執行不帶引數的 shopt
命令。需要注意的是,這是 bash 的特性,如果你執行 zsh 或者其他可供選擇的 shell,可能無法使用。
通過子 shell 返回到當前目錄
如果你曾經配置過一個比較複雜的系統,那麼你可能會發現你需要頻繁的更換目錄,從而很難跟蹤你所在的位置。如果在執行完一個命令後自動返回到當前位置,不是很好嗎?
Linux 系統實際上提供了一個解決該問題的方法,並且非常簡單。如果你想通過 cd
命令進入另一個目錄完成一些任務,然後再返回當前工作目錄,那麼你可以將命令置於括號中。你可以在你的 Linux 系統上嘗試下面這個命令。記住你當前的工作目錄,然後執行:
1 |
(cd /etc && ls -a) |
該命令會輸出 /etc
目錄的內容。現在,檢查你的當前工作目錄。它和執行該命令前的目錄一樣,而不是 /etc
目錄。
它是如何工作的呢?執行一個括號中的命令會建立一個子 shell 或一個當前 shell 程式的復刻副本。該子 shell 可以訪問所有的父變數,反之則不行。所以請記住,你是在執行一個非常複雜的單行命令。
在並行處理中經常使用子 shell ,但是在命令列中,它也能為你帶來同樣的力量,從而使你在瀏覽檔案系統時更加容易。
作者簡介:
Phil Zona 是 Linux Academy 的技術作家。他編寫了 AWS、Microsoft Azure 和 Linux 系統管理的指南和教程。他同時也管理著 Cloud Assessments 部落格,該部落格旨在幫助個人通過技術實現他們的事業目標。