fc
(Fix Commands 的縮寫)是個 shell 內建命令,用於在互動式 shell 裡列出、編輯和執行最近輸入的命令。你可以用你喜歡的編輯器編輯最近的命令並再次執行,而不用把它們整個重新輸入一遍。除了可以避免重複輸入又長又複雜的命令,它對修正拼寫錯誤來說也很有用。因為是 shell 內建命令,大多 shell 都包含它,比如 Bash 、 Zsh 、 Ksh 等。在這篇短文中,我們來學一學在 Linux 中使用 fc
命令。
fc 命令教程及示例
列出最近執行的命令
執行不帶其它引數的 fc -l
命令,它會列出最近 16 個命令。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ fc -l 507 fish 508 fc -l 509 sudo netctl restart wlp9s0sktab 510 ls -l 511 pwd 512 uname -r 513 uname -a 514 touch ostechnix.txt 515 vi ostechnix.txt 516 echo "Welcome to OSTechNix" 517 sudo apcman -Syu 518 sudo pacman -Syu 519 more ostechnix.txt 520 wc -l ostechnix.txt 521 cat ostechnix.txt 522 clear |
-r
選項用於將輸出反向排序。
1 2 |
$ fc -lr |
-n
選項用於隱藏行號。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ fc -ln nano ~/.profile source ~/.profile source ~/.profile fc -ln fc -l sudo netctl restart wlp9s0sktab ls -l pwd uname -r uname -a echo "Welcome to OSTechNix" sudo apcman -Syu cat ostechnix.txt wc -l ostechnix.txt more ostechnix.txt clear |
這樣行號就不再顯示了。
如果想以某個命令開始,只需在 -l
選項後面加上行號即可。比如,要顯示行號 520 至最近的命令,可以這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ fc -l 520 520 ls -l 521 pwd 522 uname -r 523 uname -a 524 echo "Welcome to OSTechNix" 525 sudo apcman -Syu 526 cat ostechnix.txt 527 wc -l ostechnix.txt 528 more ostechnix.txt 529 clear 530 fc -ln 531 fc -l |
要列出一段範圍內的命令,將始、末行號作為 fc -l
的引數即可,比如 520 至 525:
1 2 3 4 5 6 7 8 |
$ fc -l 520 525 520 ls -l 521 pwd 522 uname -r 523 uname -a 524 echo "Welcome to OSTechNix" 525 sudo apcman -Syu |
除了使用行號,我們還可以使用字元。比如,要列出最近一個 pwd
至最近一個命令之間的所有命令,只需要像下面這樣使用起始字母即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ fc -l p 521 pwd 522 uname -r 523 uname -a 524 echo "Welcome to OSTechNix" 525 sudo apcman -Syu 526 cat ostechnix.txt 527 wc -l ostechnix.txt 528 more ostechnix.txt 529 clear 530 fc -ln 531 fc -l 532 fc -l 520 533 fc -l 520 525 534 fc -l 520 535 fc -l 522 536 fc -l l |
要列出所有 pwd
和 more
之間的命令,你可以都使用起始字母,像這樣:
1 2 |
$ fc -l p m |
或者,使用開始命令的首字母以及結束命令的行號:
1 2 |
$ fc -l p 528 |
或者都使用行號:
1 2 |
$ fc -l 521 528 |
這三個命令都顯示一樣的結果。
編輯並執行上一個命令
我們經常敲錯命令,這時你可以用預設編輯器修正拼寫錯誤並執行而不用將命令重新再敲一遍。
編輯並執行上一個命令:
1 2 |
$ fc |
這會在預設編輯器裡載入上一個命令。
你可以看到,我上一個命令是 fc -l
。你可以隨意修改,它會在你儲存退出編輯器時自動執行。這在命令或引數又長又複雜時很有用。需要注意的是,它同時也可能是毀滅性的。比如,如果你的上一個命令是危險的 rm -fr <some-path>
,當它自動執行時你可能丟掉你的重要資料。所以,小心謹慎對待每一個命令。
更改預設編輯器
另一個有用的選項是 -e
,它可以用來為 fc
命令選擇不同的編輯器。比如,如果我們想用 nano
來編輯上一個命令:
1 2 |
$ fc -e nano |
這個命令會開啟 nano
編輯器(而不是預設編輯器)編輯上一個命令。
如果你覺得用 -e
選項太麻煩,你可以修改你的預設編輯器,只需要將環境變數 FCEDIT
設為你想要讓 fc
使用的編輯器名稱即可。
比如,要把 nano
設為預設編輯器,編輯你的 ~/.profile
或其他初始化檔案: (LCTT 譯註:如果 ~/.profile
不存在可自己建立;如果使用的是 bash ,可以編輯 ~/.bash_profile
)
1 2 |
$ vi ~/.profile |
新增下面一行:
1 2 3 |
FCEDIT=nano # LCTT譯註:如果在子 shell 中會用到 fc ,最好在這裡 export FCEDIT |
你也可以使用編輯器的完整路徑:
1 2 |
FCEDIT=/usr/local/bin/emacs |
輸入 :wq
儲存退出。要使改動立即生效,執行以下命令:
1 2 |
$ source ~/.profile |
現在再輸入 fc
就可以使用 nano
編輯器來編輯上一個命令了。
不編輯而直接執行上一個命令
我們現在知道 fc
命令不帶任何引數的話會將上一個命令載入編輯器。但有時你可能不想編輯,僅僅是想再次執行上一個命令。這很簡單,在末尾加上連字元(-
)就可以了:
1 2 3 4 5 6 7 |
$ echo "Welcome to OSTechNix" Welcome to OSTechNix $ fc -e - echo "Welcome to OSTechNix" Welcome to OSTechNix |
如你所見,fc
帶了 -e
選項,但並沒有編輯上一個命令(例中的 echo " Welcome to OSTechNix"
)。
需要注意的是,有些選項僅對指定 shell 有效。比如下面這些選項可以用在 zsh 中,但在 Bash 或 Ksh 中則不能用。
顯示命令的執行時間
想要知道命令是在什麼時候執行的,可以用 -d
選項:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
fc -ld 1 18:41 exit 2 18:41 clear 3 18:42 fc -l 4 18:42 sudo netctl restart wlp9s0sktab 5 18:42 ls -l 6 18:42 pwd 7 18:42 uname -r 8 18:43 uname -a 9 18:43 cat ostechnix.txt 10 18:43 echo "Welcome to OSTechNix" 11 18:43 more ostechnix.txt 12 18:43 wc -l ostechnix.txt 13 18:43 cat ostechnix.txt 14 18:43 clear 15 18:43 fc -l |
這樣你就可以檢視最近命令的具體執行時間了。
使用選項 -f
,可以為每個命令顯示完整的時間戳。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
fc -lf 1 4/5/2018 18:41 exit 2 4/5/2018 18:41 clear 3 4/5/2018 18:42 fc -l 4 4/5/2018 18:42 sudo netctl restart wlp9s0sktab 5 4/5/2018 18:42 ls -l 6 4/5/2018 18:42 pwd 7 4/5/2018 18:42 uname -r 8 4/5/2018 18:43 uname -a 9 4/5/2018 18:43 cat ostechnix.txt 10 4/5/2018 18:43 echo "Welcome to OSTechNix" 11 4/5/2018 18:43 more ostechnix.txt 12 4/5/2018 18:43 wc -l ostechnix.txt 13 4/5/2018 18:43 cat ostechnix.txt 14 4/5/2018 18:43 clear 15 4/5/2018 18:43 fc -l 16 4/5/2018 18:43 fc -ld |
當然,歐洲的老鄉們還可以使用 -E
選項來顯示歐洲時間格式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
fc -lE 2 5.4.2018 18:41 clear 3 5.4.2018 18:42 fc -l 4 5.4.2018 18:42 sudo netctl restart wlp9s0sktab 5 5.4.2018 18:42 ls -l 6 5.4.2018 18:42 pwd 7 5.4.2018 18:42 uname -r 8 5.4.2018 18:43 uname -a 9 5.4.2018 18:43 cat ostechnix.txt 10 5.4.2018 18:43 echo "Welcome to OSTechNix" 11 5.4.2018 18:43 more ostechnix.txt 12 5.4.2018 18:43 wc -l ostechnix.txt 13 5.4.2018 18:43 cat ostechnix.txt 14 5.4.2018 18:43 clear 15 5.4.2018 18:43 fc -l 16 5.4.2018 18:43 fc -ld 17 5.4.2018 18:49 fc -lf |
fc 用法總結
- 當不帶任何引數時,
fc
將上一個命令載入預設編輯器。 - 當帶一個數字作為引數時,
fc
將數字指定的命令載入預設編輯器。 - 當帶一個字元作為引數時,
fc
將最近一個以指定字元開頭的命令載入預設編輯器。 - 當有兩個引數時,它們分別指定需要列出的命令範圍的開始和結束。
更多細節,請參考 man 手冊。
1 2 |
$ man fc |
好了,今天就這些。希望這篇文章能幫助到你。更多精彩內容,敬請期待!