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