在終端上,命令行包括參數(shù)(arguments)居砖、命令(command)虹脯、選項(option),它們到底指什么奏候,似乎并不重要循集,糊里糊涂的照樣敲命令,但這次不一樣蔗草,想點搞事情咒彤,不得不去查閱一番疆柔,結(jié)果如下
對于終端(shell、CMD等)镶柱,命令行如此劃分婆硬。終端并不關(guān)心這些參數(shù)的用途,它們由命令負(fù)責(zé)解釋奸例。終端指負(fù)責(zé)找到命令褂傀,并把參數(shù)交給該命令執(zhí)行核畴。
對于命令,劃分如上圖。其中能犯,選項一定得命令本身支持混蔼,否則不能稱作選項粘捎,即便有相似的格式辆布,例如
# 查詢Downloads目錄中的文件
# 選項-a:顯示以點開頭的文件
> ls -a Downloads/
. .. OneKeyMan SpaceMono.zip go1.12.13.linux-amd64.tar.gz
# 將-a替換為-e
# 結(jié)果提示e是無效的選項
> ls -e Downloads/
ls: invalid option -- 'e'
Try 'ls --help' for more information.
所以,對于命令 ls 评也,a是選項炼杖,e不是選項。想必大家都注意到了盗迟,選項都以 - 開頭坤邪,這是命令實現(xiàn)的手段,目的是將選項和參數(shù)區(qū)分開罚缕。
到目前為止艇纺,一切看著都很清晰,我們可以更進一步邮弹。
命令
有功能的可執(zhí)行程序黔衡,可以通過參數(shù)調(diào)節(jié)執(zhí)行細(xì)節(jié)。
參數(shù)
又叫變量腌乡,可以理解為盟劫,參與命令運行,調(diào)整運行方式的變量与纽。
選項
選項侣签,盡管叫做選項,但仍然有命令強制要求選項的情況渣锦,讓人困惑硝岗。
選項在DOS下叫做開關(guān)(switch),這似乎可以避免袋毙,必選選項產(chǎn)生的語義矛盾。
現(xiàn)在的Windows CMD和PowerShell中冗尤,都叫做選項听盖,和Unix胀溺、Linux一致。
短選項皆看,以 - 起頭仓坞,特點是支持選項組合,例如
# 這三個命令行的執(zhí)行結(jié)果一樣
# -l:按照長列表格式顯示
# -a:顯示以點開頭的文件
ls -l -a
ls -la
ls -al
長選項腰吟,以 -- 起頭无埃,特點是命名不縮寫,不支持組合毛雇,例如
# 等價于ls -a
ls --all
短選項嫉称,看起來很方便,能少敲鍵盤灵疮,組合功能也很棒织阅,果真如此嗎?我們看看短選項的缺點吧
-
命名辨識度低震捣,易造成混淆荔棉。
# -h: 打印命令幫助信息 awk -h # -h: --human-readable 打印友好的容量大小 ls -h
相比來說,長選項 --help 總是會打印幫助
-
組合是有限制的蒿赢,要了解清楚润樱,必須通讀所有選項的幫助說明
實際上,組合選項會有3種結(jié)果
- 命令成功執(zhí)行羡棵,謝天謝地
- 組合了互斥選項祥国,直接報錯
- 沒有設(shè)定先決選項,得不到期望效果
其中晾腔,第2點尤其讓人頭疼舌稀,如果有防呆設(shè)計就好了
帶參數(shù)的選項
究竟是什么情況需要帶參選項,我們不妨先看個例子
# --max-depth=1:指定命令變量深度為1層
du -h --max-depth=1 .
如果沒有這樣的設(shè)計灼擂,勢必需要設(shè)計 --max-depth1壁查、--max-depth2、--max-depth3 ... 這樣可怕的選項剔应,而且難以窮舉出所有使用時需求睡腿,看來帶參數(shù)的選項,適用于合并數(shù)量多的同類選項峻贮。
子命令
這樣又是什么需求下的產(chǎn)物席怪,我們再看個例子
比如,windows下的cmd纤控,輸入help查看幫助挂捻,結(jié)果得到許多的命令
C:\Users\noname>help
有關(guān)某個命令的詳細(xì)信息,請鍵入 HELP 命令名
ASSOC 顯示或修改文件擴展名關(guān)聯(lián)船万。
ATTRIB 顯示或更改文件屬性刻撒。
BREAK 設(shè)置或清除擴展式 CTRL+C 檢查骨田。
BCDEDIT 設(shè)置啟動數(shù)據(jù)庫中的屬性以控制啟動加載。
CACLS 顯示或修改文件的訪問控制列表(ACL)声怔。
CALL 從另一個批處理程序調(diào)用這一個态贤。
CD 顯示當(dāng)前目錄的名稱或?qū)⑵涓摹?CHCP 顯示或設(shè)置活動代碼頁數(shù)。
CHDIR 顯示當(dāng)前目錄的名稱或?qū)⑵涓摹?CHKDSK 檢查磁盤并顯示狀態(tài)報告醋火。
CHKNTFS 顯示或修改啟動時間磁盤檢查悠汽。
CLS 清除屏幕。
CMD 打開另一個 Windows 命令解釋程序窗口芥驳。
COLOR 設(shè)置默認(rèn)控制臺前景和背景顏色柿冲。
COMP 比較兩個或兩套文件的內(nèi)容。
COMPACT 顯示或更改 NTFS 分區(qū)上文件的壓縮晚树。
CONVERT 將 FAT 卷轉(zhuǎn)換成 NTFS姻采。你不能轉(zhuǎn)換
當(dāng)前驅(qū)動器。
...
那如果爵憎,這個命令僅僅是終端上的一個命令呢慨亲?是不是可能和其他命令產(chǎn)生重名呢?我想子命令很好的解決了這個問題宝鼓,事實上刑棵,子命令一些列相關(guān)命令,由同一個開發(fā)團隊維護愚铡。
git add
而不是 git-add
蛉签,不難發(fā)現(xiàn),子命令除了清楚告訴用戶沥寥,命令所在域是 git
碍舍,單獨執(zhí)行g(shù)it命令,還能從整體上了解git 命令集邑雅,所有子命令的功能全貌片橡,這顯然是 git-add
無法達到的。
看來(主)命令淮野,是子命令啟動入口捧书,是一層命名空間,也是承載子命令的平臺骤星。
注:主命令并非是共識的叫法经瓷,英文資料中都叫command,這顯然容易混淆洞难,我在這里加了主命令這個叫法舆吮,用來區(qū)分命令和
支持子命令的命令(表達不出
討論
基于命令行交互,優(yōu)點是輸入方式統(tǒng)一,高效歪泳,多命令協(xié)同能力強萝勤;缺點是露筒,命令選項使用不直觀呐伞,需要記憶內(nèi)容多,上手困難慎式。如果伶氢,現(xiàn)在許多應(yīng)用、游戲在用戶首次使用時瘪吏,會展示操作引導(dǎo)癣防,借此讓用戶快速上手使用,極少數(shù)的命令掌眠,提供prompt設(shè)計蕾盯,這些都可以有效降低學(xué)習(xí)門檻,讓命令程序發(fā)揮更大價值蓝丙。
zsh级遭、fish shell提供了prompt,很好的解決了命令多渺尘,上手困難的問題挫鸽,但改變整個shell環(huán)境意味著更多的學(xué)習(xí)成本,事實上大多數(shù)人都是從bash入門的鸥跟。用或是不用丢郊,似乎都還不是最想要的選擇,我想很多人應(yīng)該想要折衷的方案医咨。
kube-prompt 是交互友好的kubernetes客戶端枫匾,從中可以看出,命令自帶提示帶來的好處
- 可用選項會用自動補全提示拟淮,同時你將看到每個選項的幫助說明干茉。
- 通過對提示的編排,有效的避免了使用短選項組合缺點惩歉,選項的依賴性等脂、互斥性被隱藏,提示菜單的幫助下撑蚌,用戶總是能做出命令支持的選擇上遥。
- 命令自帶提示,無需改變整個shell環(huán)境争涌,我們照常使用自己熟悉的shell環(huán)境粉楚,在沒有額外學(xué)習(xí)成本的情況下,更高效,更不易出錯模软。
當(dāng)然伟骨,讓每個命令都去實現(xiàn)prompt自動補全,不現(xiàn)實燃异,換一個思路携狭,可以實現(xiàn)一套通用prompt,讓每個命令行程序可以簡單接入進來回俐,是不是更好呢逛腿。
值得一提的是,Windows下目前存在多個shell環(huán)境仅颇,cmd单默、powershell、wsl shell忘瓦,不同的shell差異很大搁廓,這無疑給新手用戶增加不少學(xué)習(xí)成本。如果耕皮,存在這樣一個命令提示補全的包裝程序境蜕,將cmd、powershell明场、wsl shell中你最常使用的命令集成進去汽摹,包裝成帶提示自動補全的子命令,是不是很有用呢苦锨。
參考內(nèi)容:
Difference between terms: “option”, “argument”, and “parameter”?