參數(shù)酌伊、命令腾窝、選項傻傻分不清楚

在終端上,命令行包括參數(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é)果

    1. 命令成功執(zhí)行羡棵,謝天謝地
    2. 組合了互斥選項祥国,直接報錯
    3. 沒有設(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”?

Command Arguments and Options

windows命令幫助

powershell命令行幫助

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逼泣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舟舒,更是在濱河造成了極大的恐慌拉庶,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秃励,死亡現(xiàn)場離奇詭異氏仗,居然都是意外死亡,警方通過查閱死者的電腦和手機夺鲜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門皆尔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人币励,你說我怎么就攤上這事慷蠕。” “怎么了食呻?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵流炕,是天一觀的道長澎现。 經(jīng)常有香客問我,道長每辟,這世上最難降的妖魔是什么剑辫? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮渠欺,結(jié)果婚禮上妹蔽,老公的妹妹穿的比我還像新娘。我一直安慰自己峻堰,他們只是感情好讹开,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布盅视。 她就那樣靜靜地躺著捐名,像睡著了一般。 火紅的嫁衣襯著肌膚如雪闹击。 梳的紋絲不亂的頭發(fā)上镶蹋,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天,我揣著相機與錄音赏半,去河邊找鬼贺归。 笑死,一個胖子當(dāng)著我的面吹牛断箫,可吹牛的內(nèi)容都是我干的拂酣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼仲义,長吁一口氣:“原來是場噩夢啊……” “哼婶熬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起埃撵,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤赵颅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暂刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饺谬,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年谣拣,在試婚紗的時候發(fā)現(xiàn)自己被綠了募寨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡森缠,死狀恐怖拔鹰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辅鲸,我是刑警寧澤格郁,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響例书,放射性物質(zhì)發(fā)生泄漏锣尉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一决采、第九天 我趴在偏房一處隱蔽的房頂上張望自沧。 院中可真熱鬧,春花似錦树瞭、人聲如沸拇厢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孝偎。三九已至,卻和暖如春凉敲,著一層夾襖步出監(jiān)牢的瞬間衣盾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工爷抓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留势决,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓蓝撇,卻偏偏與公主長得像果复,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渤昌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349