怎麼理解命令行裏的單詞前面加「-」或「--」或什麼都不加?
我知道不管加「-」還是「--」,都表示傳參的意思,前者表示縮寫,後者表示全稱,如conda create -n tensorflow python=3.6,表示name這個變數縮寫是n,且傳入的值是tensorFlow;再比如uwsgi --ini mysite.ini表示ini這個變數沒有縮寫,且傳入的值是mysite.ini,但是我的疑問是那些前面沒有「-」和「--」的單詞扮演的是什麼角色呢?比如上面python=3.6中的python,再比如service nginx restart ,為什麼輸入這句話就可以重啟nginx伺服器,這個底層原理不應該是調用什麼函數嗎?為什麼沒有傳參呢,按道理來說,不應該是service --伺服器名 nginx --具體操作 restart,為什麼直接寫了一個短語就可以了呢?之所以有這個疑問,主要是平時命令行裏的操作太多了,有的加「-」,有的加「--」,有的啥也不加。
命令行後面跟的都是參數, 參數中包含操作命令, 被操作的對象, 選項等. 一般帶橫線的是選項; 命令, 對象等一般不帶橫線.
至於選項前加一個橫線或者兩個橫線, 是不同的風格:
- 一個橫線是UNIX/POSIX風格
- 兩個橫線是GNU長選項風格
- 沒有橫線是BSD風格
不過這只是歷史來源, 現實中並沒有嚴格按照什麼風格來設計加選項的格式, 主要是看作者喜好, 但是也有些規律可循. 比如單字元的選項用一個橫線, 多字元選項用兩個橫線, BSD風格的選項格式很少見, 所以不加橫線的一般都是非選項參數.
比如 service 命令的格式:
service SCRIPT COMMAND [OPTIONS]
其中 SCRIPT COMMAND OPTIONS 都是參數, 但只有OPTIONS是加橫線的.
比如 service nginx restart --full-restart 這個命令有3個參數:
- arg[1]: nginx #具體指/etc/init.d/nginx這個腳本(SCRIPT)
- arg[2]: restart #傳入nginx腳本的命令(COMMAND)
- arg[3]: --full-restart #選項(OPTIONS)
以curl為例:
curl [options...] &
具體命令:
curl -s -S localhost
其中"-s"和"-S"是options, "localhost"是url參數. url不是選項, 是被操作的對象.
curl也提供GNU長選項風格, -s 等價於 --silent, -S 等價於 --show-error, 即:
curl --silent --show-error localhost
這裡說一下為什麼單字元選項前加一個橫線, 而多字元選項需要加兩個橫線.
因為單字元的選項, 往往可以合併, curl -s -S 等價於 crul -sS.
如果curl還有一個選項是sS, 就和 -s -S 衝突了, 所以多字元選項要寫成 --sS (如果有這個選項的話).
三種風格的選項都提供的程序, 我只想到ps這一個例子.
ps的命令結構:
ps [options]
BSD風格:
ps a u x
其中 "a" "u" "x" 都是選項, 這就是BSD風格的選項格式.
UNIX風格:
ps -e -f
GNU長選項:
ps --deselect
受評論區啟發, 又去搜了一下, 原來命令行選項除了一個橫線/兩個橫線/沒有橫線這三種風格, 還可以進一步細分:
- Single-letter options preceded by single dash, groupable when there is no argument, argument can be attached to option letter or in next argument (many, many Unix commands; most POSIX commands).
- Single-letter options preceded by single dash, grouping not allowed, arguments must be attached (RCS).
- Single-letter options preceded by single dash, grouping not allowed, arguments must be separate (pre-POSIX SCCS, IIRC).
- Multi-letter options preceded by single dash, arguments may be attached or in next argument (X11 programs).
- Multi-letter options preceded by single dash, may be abbreviated (Atria Clearcase).
- Multi-letter options preceded by single plus (obsolete).
- Multi-letter options preceded by double dash; arguments may follow = or be separate (GNU utilities).
- Options without prefix/suffix, some names have abbreviations or are implied, arguments must be separate. (AmigaOS Shell, added by porneL)
來源: Short/long options with option argument - is this some sort of convention?
沒有開發過命令行工具,僅做過一些基本的瞭解,如果回答有錯漏,還請知友指正
因為不同的命令定義了不同的參數解析/檢查方式
命令行裏的命令並不神祕,本質上它們基本上都是通過獲取 input 內容後,以空格或其他約定字元解析成參數數組,然後再在後續的計算中引用給出結果的。
舉例來說,假如存在一個 plus 的命令,接受 1 個或 1 個以上數量參數,然後輸出為所有參數的和,可能會有如下幾種形式:
plus 1 2 3
plus 1, 2, 3
如果是 python 開發的話,以下代碼就能列印出上面輸入的內容,sys.argv 則可以按照不同字元串規則來解析用於求和計算:
# script plus.py
#!/usr/bin/env python
import sys
print(sys.argv)
純粹的求和計算不需要考慮順序,但如果是用於配置,區分參數裏的各元素就有必要了。
命令行參數的「演化史」
假設有一個查詢郵編的命令 postCode,根據我們提供的 country、province、city 就可以給出對應的郵政編碼。這時候不能像 plus 命令那樣「隨便」了,因為三個參數都是字元串,如果不區分名稱的話,就得要求順序,最穩妥的方式,當然是為每個參數分配一個名稱,那麼輸入可能就變成這樣了:
# 什麼都不加
postCode country china province sichuan city chengdu
是不是一眼看過去快瞎了?很難分清楚,於是這樣:
# 加兩個橫線
postCode --country china --province sichuan --city chengdu
或者這樣,順序錯了也沒關係:
# 加兩個橫線,不同的參數順序沒問題
postCode --country china --city chengdu --province sichuan
但可能有的開發者認為兩個中橫線給用戶帶來了不必要的負擔,於是:
# 加一個橫線,錄入起來輕鬆些
postCode -country china -city chengdu -province sichuan
甚至簡化成這樣:
# 雙橫線配合簡寫,輸入量更少了
postCode --co china --ci chengdu --pr sichuan
小小的總結下:
雖然終端經常看起來黑漆漆的算不上美觀,但在這裡使用每條命令也是屬於「人機交互」的範疇,每個命令開發者有不同的理解和習慣,因而形成了不同的參數模式。我也不知道哪種形式更好,也許,仔細觀察認真思考後會更好吧
另外,還沒寫完就發現 @E78E84 的回答,他的回答更準確、學術,推薦知友閱讀
感謝您的閱讀,如果對使用 Mac 軟硬體使用感興趣,可以關注我的專欄《邁客隨記 —— 我和 Mac 的日常》,請點贊鼓勵我分享更多內容
都是參數。一個命令後會有若干個參數組,每個參數組大概有幾種形式:
- key
- value
- key value
- key=value
命令用哪種參數組,完全看個人習慣,一般來說:
- 以「-」開頭是簡寫,後接1~2個字母作為 key,後面又分為兩種情況:
- 如果本組不再有 value,則 key 經常用來表達命令的特性、或指定某種模式
- 如果本組有 value(只會和 key 以空格連接而非用等號),則 key 用來指定 value 的類型
- 以「--」開頭是全稱,後接一到數個單詞作為 key。當key 的組成單詞數多餘一個時,之間經常用破折號、下劃線或駝峯法連接為一個整體。同理後面分為兩種情況:
- 如果本組不再 value,則 key 經常用來表達命令的特性、或指定某種模式
- 如果本組有 value(會和 key 以空格或等號連接),則 key 用來指定 value 的類型
- 不以破折號開頭,直接用 key=value 的形式比較少見,但表意也是清晰的: key 用來指定 value 的類型
- 直接以「value」形式出現的參數組是也是較為常見的,例如 systemctl restart nginx 【原答順序有誤,經 1L 提醒已修改,最近一直在用 lnmp...】。命令選擇這種方式,傾向於用戶已經熟知命令的格式是 「systemctl [動作] [服務名]」,因此可以直接給出value而無需指明 key。
很多時候命令會提供以上四種慣用法中的一種或多種。第一種和第二種經常組合在一起用。
看第一節,命令行選項的那些事。
設計shell腳本選項:getopt - 駿馬金龍 - 博客園?www.cnblogs.com一條語句其實全是參數。。我是這樣理解的
第一個參數是這個語句調用的服務或者程序名字,操作系統執行調用。
之後的所有參數都是丟給這個程序或者服務的
有-和--以及沒有其實都是參數,僅僅便於區分而已。
結合C或者C++語言的函數更好理解
- - 和 - 都是可選項 不加就是必填項嘍
加上-或者--清楚一點,也算是潛規則,有的程序可能程序員比較懶,或者其他原因有一套自己的規則。
windows命令行一般用/。
比如一段命令行example -p --p p
程序裡面看到的實質是-p --p和p三個字元串,怎麼解析這三個字元串,就全憑程序員喜好了。
推薦閱讀: