你們好,我是良許。linux
做爲 Linux 用戶,你們確定在 Linux 終端下敲過無數的命令。有的命令很短,好比:ls
、cd
、pwd
之類,這種命令你們毫無壓力。可是,有些命令就比較長了,好比:git
$ git push origin HEAD:refs/for/master
這個時候,你要是敲錯了哪怕是一個字母,是否是很崩潰?面試
之前個人做法是,若是敲錯了命令,就把光標移動到錯誤的地方,再進行修改。相信不只是我,大部分的小夥伴都是這麼幹的吧。.net
命令比較短還好,萬一命令很長,是否是很抓狂?code
今天,良許就給你們介紹 Bash 下 7 種能夠提升命令輸入的方法,萬一輸錯了命令,能夠高效糾正過來。ip
!$
字符串
在 Bash 中,!$
表明命令中的最後一個參數。咱們來如下面的場景來講明這個符號的做用。假如我想把某個文件移動到另外一個地方,但文件名寫錯了,好比:get
$ mv /path/to/錯誤的文件 /some/other/place mv: cannot stat '/path/to/錯誤的文件': No such file or directory
在這個狀況下,咱們會把光標移動到錯誤的文件名那邊,而後將文件名修改正確。這種方法固然能夠,但如何命令比較長,效率就會比較低。博客
在這個狀況下,咱們能夠這樣操做:it
$ mv /path/to/對的文件 !$ mv /path/to/對的文件 /some/other/place
這樣咱們就沒必要再輸入最後一個參數,若是這個參數很長,那效率的提升將是顯而易見的。
!:n
咱們常常會出現將命令的參數次序放錯的狀況,好比:
$ tar -cvf afolder afolder.tar tar: failed to open
這時候一般狀況下咱們會把放錯次序的參數刪掉,而後再輸入正確的參數。這時候若是參數很長的話,我估計你都有打爆屏幕的衝動。
這時候你能夠這麼操做:
$ !:0 !:1 !:3 !:2 tar -cvf afolder.tar afolder
完美解決問題!可是,那幾個符號又是啥意思呢?
你仔細看的話,應該是能看出貓膩的。基於輸錯的那個命令,!:0
其實就是 tar
,!:1
就是 -cvf
,!:2
就是 afold
,!:3
不用我說了吧?說白了,就是位置參數。
因此咱們只要按位置參數把這幾個元素從新排好次序,就OK了,簡單吧?
PS: !:
表示的是最後一個位置元素。
!:1-$
通常來說,一條命令的第一個元素就是具體的命令,後面跟的就是參數。若是咱們要獲取全部的參數,那就可使用 !:1-$
。
好比說,我本想使用 tar 命令,但寫成了 zip :
$ zip -cvf afolder.tar afolder
這時候,你能夠這麼操做:
$ tar !:1-$
固然,若是你不想獲取全部參數的話,也可使用 !:1-2
,或者 !:3-9
來獲取參數子集,固然前提是你要有足夠多的參數。
!-n:$
在 Linux 下咱們會敲大量的命令,通常來說 !
表明的是最後一條命令,它與 !-1
是至關的。假如咱們想獲取倒數第 n 條命令的參數,可使用 !-n:$
。
好比,咱們移動文件的時候若是提示文件不存在,咱們通常會用 ls 命令去看一眼對應的目錄下有啥文件:
$ mv /path/to/wrongfile /some/other/place mv: cannot stat '/path/to/wrongfile': No such file or directory $ ls /path/to/ rightfile
這時候,咱們再使用 !$
將獲取到 /path/to/
這個元素,也就是當前最後一條命令的最後一個元素,可是咱們須要的是倒數第二條命令的元素,要怎麼辦呢?
咱們可使用 !-2:$
:
$ mv /path/to/rightfile !-2:$ mv /path/to/rightfile /some/other/place
因此咱們在命令切來切去的時候,又須要以前的元素,就可使用這個快捷鍵了。
2020 精選 阿里/騰訊等一線大廠 面試、簡歷、進階、電子書 公衆號「良許Linux」後臺回覆「資料」免費獲取
!$:h
假如咱們想打包一個文件,而後提示那個文件不存在:
$ tar -cvf system.tar /etc/afile tar: /etc/afile: Cannot stat: No such file or directory tar: Error exit delayed from previous errors.
這個時候,咱們一般的做法是,進到 /etc 目錄,而後看下那裏面有啥文件。這樣固然能夠,但若是路徑名很長的話,那你可能又想戳破屏幕了。
咱們可使用 !$:h
來獲取最後一個參數對應的路徑。如今最後一個參數是 /etc/afile
,afile 所對應的路徑就是 /etc/ 。咱們可使用 !$:h
來獲取最後一個參數對應的路徑:
$ cd !$:h cd /etc
!#:1
一般狀況下,咱們重命名一個文件,通常是這麼寫的:
$ mv /path/to/some/file /path/to/some/file.bak
這兩個參數極其類似,只是後面一個加了個 .bak ,而咱們就須要寫兩遍,太浪費時間了!咱們可使用 !#:1
來獲取當前行的第一個參數,直接修改!
$ cp /path/to/some/file !#:1.bak cp /path/to/some/file /path/to/some/file.bak
這樣是否是能夠少敲至關多的字母?
!!:gs
這個操做就更厲害了,它能夠直接替換以前命令的某些字符串。好比,咱們有這樣的一條命令:
$ echo my f key doef not work my f key doef not work
若是咱們想把 f
替換成 s
,能夠這樣操做:
$ !!:gs/f /s / echo my s key does not work my s key does not work
一樣地,若是咱們想把 does
改爲 did
,能夠這樣:
$ !!:gs/does/did/ echo my s key did not work my s key did not work
經過這種方法,就能夠把命令中的關鍵詞改爲本身想要的內容。
本文介紹了 7 個能夠提升命令輸入效率的快捷鍵,熟練使用它們的話會達到事半功倍的效果。這幾個方式還比較零散,若是你把他們放在一塊兒的,確定還會發揮出更強大的效果。