命令別名:保護和服務

2019-05-30 21:45:00

Linux shell 允許你將命令彼此連結在一起,一次觸發執行複雜的操作,並且可以對此建立別名作為快捷方式。

讓我們將繼續我們的別名系列。到目前為止,你可能已經閱讀了我們的,並且應該非常清楚它們是如何為你省去很多麻煩的最簡單方法。例如,你已經看到它們幫助我們減少了輸入,讓我們看看別名派上用場的其他幾個案例。

別名即快捷方式

Linux shell 最美妙的事情之一是可以使用數以萬計的選項和把命令連線在一起執行真正複雜的操作。好吧,也許這種美麗是在旁觀者的眼中的,但是我們覺得這個功能很實用。

不利的一面是,你經常需要記得難以記憶或難以打字出來的命令組合。比如說硬碟上的空間非常寶貴,而你想要做一些清潔工作。你的第一步可能是尋找隱藏在你的家目錄裡的東西。你可以用來判斷的一個標準是查詢不再使用的內容。ls 可以幫助你:

ls -lct

上面的命令顯示了每個檔案和目錄的詳細資訊(-l),並顯示了每一項上次存取的時間(-c),然後它按從最近存取到最少存取的順序排序這個列表(-t)。

這難以記住嗎?你可能不會每天都使用 -c-t 選項,所以也許是吧。無論如何,定義一個別名,如:

alias lt='ls -lct'

會更容易一些。

然後,你也可能希望列表首先顯示最舊的檔案:

alias lo='lt -F | tac'

aliases

圖 1:使用 lt 和 lo 別名。

這裡有一些有趣的事情。首先,我們使用別名(lt)來建立另一個別名 —— 這是完全可以的。其次,我們將一個新引數傳遞給 lt(後者又通過 lt 別名的定義傳遞給了 ls)。

-F 選項會將特殊符號附加到專案的名稱後,以便更好地區分常規檔案(沒有符號)和可執行檔案(附加了 *)、目錄檔案(以 / 結尾),以及所有連結檔案、符號連結檔案(以 @ 符號結尾)等等。-F 選項是當你回歸到單色終端的日子裡,沒有其他方法可以輕鬆看到列表項之間的差異時用的。在這裡使用它是因為當你將輸出從 lt 傳遞到 tac 時,你會丟失 ls 的顏色。

第三件我們需要注意的事情是我們使用了管道。管道用於你將一個命令的輸出傳遞給另外一個命令時。第二個命令可以使用這些輸出作為它的輸入。在包括 Bash 在內的許多 shell 裡,你可以使用管道符(|) 來做傳遞。

在這裡,你將來自 lt -F 的輸出導給 tactac 這個命令有點玩笑的意思,你或許聽說過 cat 命令,它名義上用於將檔案彼此連線(concat),而在實踐中,它被用於將一個檔案的內容列印到終端。tac 做的事情一樣,但是它是以逆序將接收到的內容輸出出來。明白了嗎?cattac,技術人有時候也挺有趣的。

cattac 都能輸出通過管道傳遞過來的內容,在這裡,也就是一個按時間順序排序的檔案列表。

那麼,在有些離題之後,最終我們得到的就是這個列表將當前目錄中的檔案和目錄以新鮮度的逆序列出(即老的在前)。

最後你需要注意的是,當在當前目錄或任何目錄執行 lt 時:

# 這可以工作:lt# 這也可以:lt /some/other/directory

……而 lo 只能在當前目錄奏效:

# 這可工作:lo# 而這不行:lo /some/other/directory

這是因為 Bash 會展開別名的組分。當你鍵入:

lt /some/other/directory

Bash 實際上執行的是:

ls -lct /some/other/directory

這是一個有效的 Bash 命令。

而當你鍵入:

lo /some/other/directory

Bash 試圖執行:

ls -lct -F | tac /some/other/directory

這不是一個有效的命令,主要是因為 /some/other/directory 是個目錄,而 cattac 不能用於目錄。

更多的別名快捷方式

  • alias lll='ls -R' 會列印出目錄的內容,並深入到子目錄裡面列印子目錄的內容,以及子目錄的子目錄,等等。這是一個檢視一個目錄下所有內容的方式。
  • mkdir='mkdir -pv' 可以讓你一次性建立目錄下的目錄。按照 mkdir 的基本形式,要建立一個包含子目錄的目錄,你必須這樣:
mkdir newdirmkdir newdir/subdir

或這樣:

mkdir -p newdir/subdir

而用這個別名你將只需要這樣就行:

mkdir newdir/subdir

你的新 mkdir 也會告訴你建立子目錄時都做了什麼。

別名也是一種保護

別名的另一個好處是它可以作為防止你意外地刪除或覆寫已有的檔案的保護措施。你可能聽說過這個 Linux 新使用者的傳言,當他們以 root 身份執行:

rm -rf /

整個系統就爆了。而決定輸入如下命令的使用者:

rm -rf /some/directory/ *

就很好地幹掉了他們的家目錄的全部內容。這裡不小心鍵入的目錄和 * 之間的那個空格有時候很容易就會被忽視掉。

這兩種情況我們都可以通過 alias rm='rm -i' 別名來避免。-i 選項會使 rm 詢問使用者是否真的要做這個操作,在你對你的檔案系統做出不可彌補的損失之前給你第二次機會。

對於 cp 也是一樣,它能夠覆蓋一個檔案而不會給你任何提示。建立一個類似 alias cp='cp -i' 來保持安全吧。

下一次

我們越來越深入到了指令碼領域,下一次,我們將沿著這個方向,看看如何在命令列組合命令以給你真正的樂趣,並可靠地解決系統管理員每天面臨的問題。