* 在 Bash 中,可以使用?**Tab**?自動補全參數,使用?**ctrl-r**?搜索命令行歷史。
* 在 Bash 中,使用?**ctrl-w**?刪除你鍵入的最后一個單詞,使用?**ctrl-u**?刪除整行,使用?**alt-b**?和?**alt-f**?按單詞移動,使用**ctrl-k**?從光標處刪除到行尾,使用?**ctrl-l**?清屏。鍵入?`man readline`?查看 Bash 中的默認快捷鍵,內容很多。例如?**alt-.**循環地移向前一個參數,以及?**alt-*** 展開通配符。
* 你喜歡的話,可以鍵入?`set -o vi`?來使用 vi 風格的快捷鍵。
* 鍵入?`history`?查看命令行歷史記錄。其中有許多縮寫,例如?`!$`(最后鍵入的參數)和?`!!`(最后鍵入的命令),盡管通常被?**ctrl-r**?和?**alt-.**?取代。
* 回到上一個工作路徑:`cd -`
* 如果你輸入命令的時候改變了主意,按下?**alt-#**?在行首添加?`#`(將你輸入的命令視為注釋),并回車。這樣做的話,之后你可以很方便的利用命令行歷史回到你剛才輸入到一半的命令。
* 使用?`xargs`?( 或?`parallel`)。他們非常給力。注意到你可以控制每行參數個數(`-L`)和最大并行數(`-P`)。如果你不確定它們是否會按你想的那樣工作,先使用?`xargs echo`?查看一下。此外,使用?`-I{}`?會很方便。例如:
~~~
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
~~~
* `pstree -p`?有助于展示進程樹。
* 使用?`pgrep`?和?`pkill`?根據名字查找進程或發送信號。
* 了解你可以發往進程的信號的種類。比如,使用?`kill -STOP [pid]`?停止一個進程。使用?`man 7 signal`?查看詳細列表。
* 使用?`nohup`?或?`disown`?使一個后臺進程持續運行。
* 使用?`netstat -lntp`?或?`ss -plat`?檢查哪些進程在監聽端口(默認是檢查 TCP 端口; 使用參數?`-u`?檢查 UDP 端口)。
* 有關打開套接字和文件,請參閱?`lsof`。
* 使用?`uptime`?或?`w`?來查看系統已經運行多長時間。
* 使用`alias`來創建常用命令的快捷形式。例如:`alias ll='ls -latr'`使你可以方便地執行`ls -latr`命令。
* 在 Bash 腳本中,使用?`set -x`?去調試輸出,盡可能的使用嚴格模式,使用?`set -e`?令腳本在發生錯誤時退出而不是繼續運行,使用?`set -o pipefail`?嚴謹地對待錯誤(盡管問題可能很微妙)。當牽扯到很多腳本時,使用?`trap`。
* 在 Bash 腳本中,子 shell(使用括號`(...)`)是一種便捷的方式去組織參數。一個常見的例子是臨時地移動工作路徑,代碼如下:
~~~
# do something in current dir
(cd /some/other/dir && other-command)
# continue in original dir
~~~
* 在 Bash 中,注意到其中有許多形式的擴展。檢查變量是否存在:`${name:?error message}`。例如,當 Bash 腳本需要一個參數時,可以使用這樣的代碼?`input_file=${1:?usage: $0 input_file}`。數學表達式:`i=$(( (i + 1) % 5 ))`。序列:`{1..10}`。 截斷字符串:`${var%suffix}`?和?`${var#prefix}`。例如,假設?`var=foo.pdf`,那么?`echo ${var%.pdf}.txt`?將輸出?`foo.txt`。
* 通過使用?`<(some command)`?可以將輸出視為文件。例如,對比本地文件?`/etc/hosts`?和一個遠程文件:
~~~
diff /etc/hosts <(ssh somehost cat /etc/hosts)
~~~
* 了解 Bash 中的“here documents”,例如?`cat <<EOF ...`。
* 在 Bash 中,同時重定向標準輸出和標準錯誤,`some-command >logfile 2>&1`。通常,為了保證命令不會在標準輸入里殘留一個打開了的文件句柄導致你當前所在的終端無法操作,添加?`</dev/null`?是一個好習慣。
* 使用?`man ascii`?查看具有十六進制和十進制值的ASCII表。`man unicode`,`man utf-8`,以及?`man latin1`?有助于你去了解通用的編碼信息。
* 使用?`screen`?或?[`tmux`](https://tmux.github.io/)?來使用多個屏幕,當你在使用 ssh 時(保存 session 信息)將尤為有用。另一個輕量級的解決方案是?`dtach`。
* ssh 中,了解如何使用?`-L`?或?`-D`(偶爾需要用?`-R`)去開啟隧道是非常有用的,例如當你需要從一臺遠程服務器上訪問 web。
* 對 ssh 設置做一些小優化可能是很有用的,例如這個?`~/.ssh/config`?文件包含了防止特定環境下斷開連接、壓縮數據、多通道等選項:
~~~
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
~~~
* 部分其他的關于 ssh 的選項是安全敏感且應當小心啟用的。例如在可信任的網絡中:`StrictHostKeyChecking=no`,`ForwardAgent=yes`
* 獲取文件的八進制格式權限,使用類似如下的代碼:
~~~
stat -c '%A %a %n' /etc/timezone
~~~
* 使用?[`percol`](https://github.com/mooz/percol)?或者?[`fzf`](https://github.com/junegunn/fzf)?可以交互式地從另一個命令輸出中選取值。
* 使用?`fpp`([PathPicker](https://github.com/facebook/PathPicker))可以與基于另一個命令(例如?`git`)輸出的文件交互。
* 將 web 服務器上當前目錄下所有的文件(以及子目錄)暴露給你所處網絡的所有用戶,使用:?`python -m SimpleHTTPServer 7777`?(使用端口 7777 和 Python 2)或`python -m http.server 7777`?(使用端口 7777 和 Python 3)。
* 以某種權限執行命令,使用`sudo`(root 權限)或`sudo -u`(其他用戶)。使用`su`或者`sudo bash`來啟動一個以對應用戶權限運行的 shell。使用`su -`模擬其他用戶的登錄。