如何在命令行上舒適地生存?
有時(shí)我與一些害怕使用命令行的朋友交談,我感到自己給不出好的建議(我已經(jīng)使用命令行太長(zhǎng)時(shí)間了),因此我向一些 Mastodon 上的人提出了以下問(wèn)題:
如果在過(guò)去一到三年內(nèi),你剛剛不再害怕使用命令行了,是什么幫助了你?
(如果你不記得,或者你已經(jīng)使用命令行舒適地工作了 15 年,則無(wú)需回答——這個(gè)問(wèn)題不適用于你 ??)
這個(gè)列表還不如我希望的那么長(zhǎng),但我希望通過(guò)發(fā)布它來(lái)收集更多的答案。顯然,并沒(méi)有一個(gè)單一的方法適用于所有人,不同的人會(huì)選擇不同的路徑。
我認(rèn)為舒適使用命令行有三個(gè)方面:減少風(fēng)險(xiǎn)、動(dòng)機(jī)和資源。我將先談?wù)劀p少風(fēng)險(xiǎn),然后是一些動(dòng)機(jī),并列出一些資源。
減少風(fēng)險(xiǎn)的方式
很多人(沒(méi)錯(cuò)!)對(duì)在命令行上意外執(zhí)行了一些無(wú)法撤銷(xiāo)的破壞性操作感到擔(dān)心。
以下是一些人們提到的幫助他們減少風(fēng)險(xiǎn)的策略:
- 定期備份(有人提到他們?cè)谏现艿囊粋€(gè)命令行錯(cuò)誤中意外刪除了整個(gè)家目錄,但很幸運(yùn)他們有備份)。
- 對(duì)于代碼,盡可能多地使用
git
。 - 將
rm
設(shè)置為類(lèi)似safe-rm
或rmtrash
這樣的工具的別名,這樣你就不會(huì)意外刪除不應(yīng)刪除的內(nèi)容(或者就設(shè)置別名到rm -i
)。 - 盡量避免使用通配符,使用制表符鍵補(bǔ)全代替(我的 Shell 會(huì)使用
TAB
鍵補(bǔ)全rm *.txt
并顯示我將要?jiǎng)h除的內(nèi)容)。 - 使用精美的終端提示符,可以顯示當(dāng)前目錄、計(jì)算機(jī)名稱(chēng)、
git
分支和你是否具有 root 權(quán)限。 - 如果你計(jì)劃對(duì)文件運(yùn)行未經(jīng)測(cè)試或危險(xiǎn)的命令,先備份文件副本。
- 擁有一臺(tái)專(zhuān)用的測(cè)試機(jī)器(如便宜的舊 Linux 計(jì)算機(jī)或樹(shù)莓派)進(jìn)行特別危險(xiǎn)的測(cè)試,例如測(cè)試備份軟件或分區(qū)。
- 對(duì)于危險(xiǎn)命令,如果有的話(huà),使用
--dry-run
選項(xiàng)來(lái)查看執(zhí)行結(jié)果而不實(shí)際執(zhí)行操作。 - 在你的 Shell 腳本中構(gòu)建自己的
--dry-run
選項(xiàng)。
這些策略有助于降低在命令行上引發(fā)不可逆操作的風(fēng)險(xiǎn)。
殺手級(jí)應(yīng)用程序
一些人提到了一個(gè)“殺手級(jí)命令行應(yīng)用程序”,這激勵(lì)他們開(kāi)始花更多時(shí)間在命令行上。例如:
- ripgrep
- jq
- wget / curl
- git(一些人發(fā)現(xiàn)他們更喜歡使用 git 命令行界面而不是使用圖形界面)
- ffmpeg(用于視頻處理)
- yt-dlp
- 硬盤(pán)數(shù)據(jù)恢復(fù)工具(來(lái)自 這個(gè)精彩的故事)
還有一些人提到他們對(duì)圖形界面工具感到失望(例如使用了所有內(nèi)存,并使計(jì)算機(jī)崩潰的重型集成開(kāi)發(fā)環(huán)境),并因此有動(dòng)機(jī)用更輕量級(jí)的命令行工具替代它們。
激發(fā)人們的命令行技巧
有人提到被其他人在命令行上展示的酷炫功能所激勵(lì),例如:
explainshell
有幾個(gè)人提到了 explainshell,它可以讓你粘貼任何命令行指令,并將其分解成不同的部分解釋。
命令歷史、制表符補(bǔ)全等等
有很多小技巧和竅門(mén)可以使在命令行上工作更容易,例如:
- 使用向上箭頭查看先前的命令
- 使用
Ctrl+R
搜索你的 Bash 歷史記錄 - 使用快捷鍵在行內(nèi)導(dǎo)航:
Ctrl+w
(刪除一個(gè)單詞)、Ctrl+a
(跳轉(zhuǎn)到行首)、Ctrl+e
(跳轉(zhuǎn)到行尾),以及Ctrl+left arrow
/Ctrl+right arrow
(向前/向后跳轉(zhuǎn)一個(gè)單詞) - 將 Bash 歷史記錄設(shè)置為無(wú)限制
- 使用
cd -
返回上一個(gè)目錄 - 文件名和命令名的制表符自動(dòng)補(bǔ)全
- 學(xué)習(xí)如何使用像
less
這樣的分頁(yè)工具閱讀手冊(cè)頁(yè)或其他大型文本文件(如搜索、滾動(dòng)等) - 在 macOS 上使用
pbcopy
/pbpaste
將剪貼板內(nèi)容復(fù)制/粘貼到 stdout/stdin - 在編輯配置文件之前備份它們
fzf
很多人提到使用 fzf 作為模糊搜索 Shell 歷史記錄的更好方法。除了作為更好的模糊搜索 Shell 歷史記錄的工具,人們還提到了一些其他用途:
- 選擇
git
分支(git checkout $(git for-each-ref --format='%(refname:short)' refs/heads/ | fzf)
) - 快速查找要編輯的文件(
nvim $(fzf)
) - 切換 Kubernetes 上下文(
kubectl config use-context $(kubectl config get-contexts -o name | fzf --height=10 --prompt="Kubernetes Context> ")
) - 從測(cè)試套件中選擇要運(yùn)行的特定測(cè)試
一般的模式是使用 fzf
來(lái)選擇某個(gè)對(duì)象(文件、git
分支、命令行參數(shù)),fzf
將所選對(duì)象輸出到標(biāo)準(zhǔn)輸出,然后將其插入作為另一個(gè)命令的命令行參數(shù)。
你還可以將 fzf
用作工具,自動(dòng)預(yù)覽輸出并快速迭代,例如:
- 自動(dòng)預(yù)覽
jq
的輸出(echo '' | fzf --preview "jq {q} < YOURFILE.json"
) - 自動(dòng)預(yù)覽
sed
的輸出(echo '' | fzf --preview "sed {q} YOURFILE"
) - 自動(dòng)預(yù)覽
awk
的輸出(echo '' | fzf --preview "awk {q} YOURFILE"
)
你可以參考這個(gè)思路。
通常,人們會(huì)為 fzf
的使用定義別名,比如輸入 gcb
或其他命令,以快速選擇要檢出的 git
分支。
樹(shù)莓派
一些人開(kāi)始使用樹(shù)莓派,這樣可以更安全地進(jìn)行實(shí)驗(yàn),而不必?fù)?dān)心損壞計(jì)算機(jī)(只需擦除 SD 卡然后重新開(kāi)始即可!)。
漂亮的 Shell 環(huán)境
很多人說(shuō),當(dāng)他們開(kāi)始使用像 oh-my-zsh 或 Fish 這樣更用戶(hù)友好的 Shell 環(huán)境時(shí),他們?cè)诿钚猩细械礁孢m。我非常同意這一點(diǎn) – 我已經(jīng)使用 Fish 十年了,我非常喜歡它。
在這里還有一些其他的事情可以做:
- 有些人說(shuō),讓他們的終端更漂亮可以幫助他們感到更舒適(“讓它變成粉色!”)。
- 設(shè)置一個(gè)漂亮的 Shell 提示符來(lái)提供更多信息(例如,當(dāng)命令失敗時(shí),可以將提示符設(shè)置為紅色)。特別是 transient prompts(在當(dāng)前命令設(shè)置一個(gè)非?;ㄉ诘奶崾痉?,但在之前的命令中設(shè)置一個(gè)簡(jiǎn)單得多的提示符)看起來(lái)非常好。
一些用于美化終端的工具:
- 我使用 base16-shell
- powerlevel10k 是一個(gè)流行的漂亮的 Zsh 主題,具有 transient prompts
- starship 是一個(gè)漂亮的提示符工具
- 在 Mac 上,我認(rèn)為 iTerm2 比默認(rèn)的終端更容易自定義。
漂亮的文件管理器
一些人提到了像 ranger 或 nnn 這樣的漂亮的終端文件管理器,這是我之前沒(méi)有聽(tīng)說(shuō)過(guò)的。
一個(gè)有幫助的朋友或同事
一個(gè)可以回答初學(xué)者問(wèn)題并給你指點(diǎn)的人是無(wú)價(jià)的。
通過(guò)肩并肩地觀察學(xué)習(xí)
有人提到觀察更有經(jīng)驗(yàn)的人使用終端 - 有很多經(jīng)驗(yàn)豐富的用戶(hù)甚至沒(méi)有意識(shí)到自己在做什么,你可以從中學(xué)到很多小技巧。
別名
很多人說(shuō),為常用任務(wù)創(chuàng)建自己的別名或腳本就像是一個(gè)神奇的“靈光一現(xiàn)”時(shí)刻,因?yàn)椋?/p>
- 他們不必記住語(yǔ)法
- 然后他們就有了一份自己常用命令的列表,可以輕松調(diào)用
查找示例的備忘單
很多手冊(cè)頁(yè)沒(méi)有示例,例如 openssl s_client 的手冊(cè)頁(yè)就沒(méi)有示例。這使得起步變得更加困難!
人們提到了一些備忘單工具,比如:
例如,openssl 的備忘單 非常棒 - 我認(rèn)為它幾乎包含了我在實(shí)際中使用 openssl
時(shí)用過(guò)的所有內(nèi)容(除了 openssl s_client
的 -servername
選項(xiàng))。
有人說(shuō)他們配置了他們的 .bash_profile
,這樣每次登錄時(shí)都會(huì)打印出一張備忘單。
不要試圖背誦
一些人說(shuō)他們需要改變自己的方法 - 他們意識(shí)到不需要試圖記住所有的命令,只需按需查找命令,隨著時(shí)間的推移,他們會(huì)自然而然地記住最常用的命令。
(我最近對(duì)學(xué)習(xí)閱讀 x86 匯編有了完全相同的體會(huì) - 我正在上一門(mén)課程,講師說(shuō)“是的,剛開(kāi)始時(shí)可以每次都查找,最終你會(huì)記住最常見(jiàn)的指令?!保?/p>
還有一些人說(shuō)相反的觀點(diǎn) - 他們使用間隔重復(fù)應(yīng)用程序(如 Anki)來(lái)記憶常用的命令。
Vim
有人提到他們開(kāi)始在命令行上使用 Vim 編輯文件,一旦他們開(kāi)始使用終端文本編輯器,使用命令行處理其他事情也變得更自然。
此外,顯然有一個(gè)名為 micro 的新編輯器,像是更好的 pico
/nano
,適用于那些不想學(xué)習(xí) Emacs 或 Vim 的人。
桌面上使用 Linux
有人說(shuō)他們開(kāi)始使用 Linux 作為他們的日常主力系統(tǒng),而需要修復(fù) Linux 問(wèn)題可以幫助他們學(xué)習(xí)。這也是我在大約 2004 年熟悉命令行的方式(我非常喜歡安裝各種不同的 Linux 發(fā)行版,以找到我最喜歡的那個(gè)),但我猜這不是如今最受歡迎的策略。
被迫僅使用終端
有些人說(shuō)他們參加了一門(mén)大學(xué)課程,教授讓他們?cè)诮K端上做所有事情,或者他們自己制定了一個(gè)規(guī)則,一段時(shí)間內(nèi)必須在終端上完成所有工作。
工作坊
有幾個(gè)人說(shuō)像 Software Carpentry 這樣的工作坊(面向科學(xué)家的命令行、Git 和 Python/R 編程簡(jiǎn)介)幫助他們更熟悉命令行。
你可以在這里查看 Software Carpentry 課程。
書(shū)籍和文章
一些提到的材料:
文章:
書(shū)籍:
- 《Effective Linux at The Command Line》
- 《Unix Power Tools》(可能有些過(guò)時(shí))
- 《The Linux Pocket guide》
視頻:
- Mindy Preston 的 CLI tools aren’t inherently user-hostile
- Gary Bernhardt 的 destroy all software screencasts
- DistroTube