詳解Linux中“!”命令——各類型用法總結

概述

工作中,不起眼的“!”在linux中有著很多讓你驚歎的妙用。下面介紹下那些“!”的神奇用法。

詳解Linux中“!”命令——各類型用法總結

執行上一條命令

例如,在執行完上面一條命令後,可以使用下面的方式再次執行上一條命令:

$ whereis bash #執行命令
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
$ !! #再次執行上一條命令
whereis bash
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

!!代表了上一條執行的命令。可以看到,當輸入兩個感嘆號時,它顯示上條命令的同時會執行上一條命令。當然了,通常我們還會想到使用“UP”鍵來完成這個事情。但是如果是基於上條命令擴充,!!就來得更加方便了。

比如,你想查看某個文件,但是忘了輸入more:

$ /opt/user/test.txt #忘記輸入more
$ more !! #這樣是不是快多了?

使用!!是不是方便多了?

使用上個命令第一個或最後一個的參數執行命令

使用上條命令最後一個參數

比如,你在使用ls列出目錄內容時,沒有帶任何參數,但是想再次執行,帶上-al參數,又不想輸入長長的參數,可以使用下面的方式:

$ ls /proc/1/task/1/net/tcp
/proc/1/task/1/net/tc
$ ls -al !$
ls -al /proc/1/task/1/net/tcp
-r--r--r-- 1 root root 0 12月 22 17:30 /proc/1/task/1/net/tcp

這裡的!$代表了上一條命令的最後一個參數。

使用上條命令第一個參數

而使用上條命令的第一個參數只需要使用!^,例如:

$ ls -al !^

去掉最後一個參數執行上一個命令

如果想執行上條命令,但不想帶上最後一個參數:

$ ls -al dir #假設dir是一個很長的字符串
$ !:-
ls -al

什麼場景下可能會用呢?比如你上一條命令最後一個參數是一個長長的字符串,而你恰好不想不用它,並且退格鍵刪除又慢的時候,可以使用上面的方法。

使用上條命令的所有參數

前面說了使用上條命令的最後一個參數,那如果不是最後一個參數,該如何使用呢?很簡單,使用!*即可。例如我們在輸入find命令輸錯了,想要糾正的時候:

$ fin -name "test.zip" #這裡find輸錯了。
$ find !*
find ./ -name "test.zip"
./workspaces/shell/find/test.zip
./workspaces/shell/test.zip

使用上條命令指定的參數

有的讀者可能會問了,如果我只想用其中某個參數呢?按照![命令名]:[參數號]的規則即可。例如:

$ cp -rf dira dirb/ #將dira拷貝到dirb
$ ls -l !cp:2 #查看dira的內容
ls -l dira
total 0
-rw-rw-r-- 1 hyb hyb 0 12月 22 17:45 testfile

當上條命令的參數很長,而你需要取用中間的某個參數時,效果就比較明顯了。

執行上一條以關鍵字開頭的命令

例如,執行上一條find命令:

$ !find #執行上條以find開頭的命令

邏輯非的作用

這個是它最為人所熟悉的作用,例如刪除除了cfg結尾以外的所有文件:

rm !(*.cfg) 

總結

驚歎號”!”的作用確實有時候讓人驚歎。前面可能只是提到!結合其他字符代表某個特定的含義的某種使用,實際上,我們可以組合或者擴展發現更多的妙用。這裡不再展開。大家還有什麼好的發現可以在下方留言哦!

詳解Linux中“!”命令——各類型用法總結


分享到:


相關文章: