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