Shell

Linux命令行下”!”的十個神奇用法

Linux 系統中,"!" 符號或者操作符通常被用做邏輯否定的操作符,同時也通過一些調整和改動命令來從歷史記錄中找出你需要的命令行。下面演示的命令行在bash Shell中都已經明確檢查過可用了。不過我沒有在其他的 Shell 解釋器下測試過,不過我相信這些命令也不會在其他的解釋器下運行。那麼現在就讓我們學習一下 "!" 這神奇而獨特的用法吧!

1.從歷史記錄中使用命令號來運行命令

你也許從沒意識到過可以從命令行歷史記錄(之前執行過的命令)里執行一條命令,首先輸入 "history" 命令得到命令的序號。  11

這時你可以通過命令 history 的輸出中的命令序號來執行一條命令。22

上面可以看到它執行了號碼為1551的 top 命令,這種執行方式對執行某些特別長的命令非常有用,你只要使用"!"符號加上命令的序號就能執行該命令啦。

2.執行指定的之前執行過的命令

你可以運行 !-1、!-2 或者 !-7 等命令來執行你記錄序列中的倒數第一條命令、倒數第二條命令已經倒數第七條等等。。。和上面的方式一樣,你需要先用 history 命令來列出命令列表。其實這個命令非常有用,你可以通過它來確定沒有執行過某些錯誤命令比如 "rm command >file" 或者別的危險指令。這裡給出了執行倒數第六個、第八個和第十個命令的效果。33

3.向一條新命令傳遞舊命令的參數避免重複輸入

比如說我需要列出 '/home/$USER/Binary/firefox' 這個目錄。6

但是這個時候我又想用 "ls-l"查看這個目錄下的具體信息,那麼我需要重新輸入上面的命令嗎?當然不需要,你只要用下面這個命令:7

"!$" 符號可以將上一條命令的參數傳遞給下一條命令參數:5

4.如何用(!)處理兩個以上的參數?例如我在桌面上創建了一個 1.txt 文件

8

然後使用CP命令把它複製到 'home/avi/Downloads' 目錄9

這樣我們就向CP命令傳遞了兩個參數。第一個是 '/home/avi/Desktop/1.txt' ,第二個是'/home/avi/Downloads',為了區分它們,我們 使用 echo 來列印每個參數。

10

可以注意到第一個參數可以使用 "!^" 來表示,剩下的參數就可以使用 "命令名:參數序號"這種方式來表示,比如 "!cp:2"。再舉個例子,如果你執行的某個命令為 "xyz",命令 後面有5個參數而你想調用第四個參數,就可以使用 "!xyz:4" 來調用它。當然,你可以使用 "!* " 來表示所有參數。

6

5.通過關鍵詞來執行之前的命令

我們可以通過執行關鍵詞來執行之前的命令。可以按照下面的命令來理解:

11

上面是相同的ls命令對應了不同參數和文件夾。此外我們將每一個標準輸出都傳遞到了 '/dev/null' 因為我們並不希望處理程序的標準輸出。現在我們可以調用命令的關鍵詞來實現它們。12

當你使用 "ls" 關鍵詞來執行之前命令的時候,你一定會被標準輸出給驚訝到。7

6.非常實用的 !! 操作符

你可以使用(!!)來運行或者改變之前的命令。它會調用最近使用的命令來調整當前命令,給大家展示一下使用場景。

昨天我運行了一個獲取IP的Shell命令:

13

突然我意識到需要將結果重定向到 ip.txt 中,這時你應該想到用 "UP" 鍵恢復上一個命令再加上 '>ip.txt' 命令來重定向進去:

14

感謝這次救命的"UP" 鍵。那麼再考慮下這個場景,如果我需要運行下面的這個腳本:15

當我運行它的時候突然報出了"bash:ifconfig:command not found"錯誤,我意識到可能是我設定了這個命令需要root許可權來運行它。那麼現在怎麼辦?需要重新登錄root賬號來執行它么?這種情況下使用"up"鍵也並不管用。所以這裡我們使用 "!!" 命令來選擇調用這條命令。16

顯而易見的是 su 是用來選擇執行用戶的, -c 是用來表示執行具體命令的,最重要的部分 "!!" 代替了你最後一次運行的命令。然後輸入你的root密碼即可運行它了。8

我相信下面的場景非常適合 "!!"  的使用。

當你使用普通的賬戶來執行 apt-get 的時候,常常會報錯提示你沒有許可權執行。17

哈哈不用擔心,這時候就可以使用下面的命令來成功執行了: 18

同樣有類似的場景:如果普通用戶沒有許可權,即可這樣運行:20

7.使用 !(文件名) 的方式來避免命令對某個文件的影響

這裡的 "!" 符號相當於邏輯否定來使用,用來避免對加了 "!" 前綴的文件產生影響。

A.從目錄中刪除除 2.txt 外的所有文件:21

B.從目錄中刪除 pdf 為後綴以外的文件(請忽略下圖中多出來的一個$):22

8.檢查某個目錄是否存在,如果存在就將其列印

這裡使用 '! -d'  命令來判斷目錄是否為空,同時使用 "&&" "||" 命令來列印判斷目錄是否存在:23

9.檢測目錄是否是否為空,如果為空則退出

和上面的命令類似。這裡是檢測目錄是否為空,如果為空則退出命令24

10.檢測目錄是否為空,如果為空則在 home 目錄中重新創建目錄25

原文鏈接:http://www.tecmint.com/mysterious-uses-of-symbol-or-operator-in-linux-commands/

對這篇文章感覺如何?

太棒了
2
不錯
0
愛死了
0
不太好
0
感覺很糟
0
JAVA+LINUX+DATABASE+逗B戰鬥機+我的女友好高冷

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Shell

    Shell

    如何清除 PHP composer 的緩存或刪除其文件夾

    在使用 PHP Composer 進行工作時,您是否遇到了緩慢的性能問題,為了提高其效率以及管理依賴關係,請嘗試清除您的項目的 Composer 緩存。 對於那些不熟悉的人,本文是關於 PHP 應用程 […]
    Shell

    在Powershell中使用開源命令

    在Windows上設置路徑,以便可以使用開源命令 當您在操作系統上啟動應用程序時,您的操作系統需要使用某些代碼庫和實用程序才能運行該應用程序。你的操作系統知道如何找到這些庫和實用程序,因為它有一個系統 […]