我知道不管加「-」還是「--」,都表示傳參的意思,前者表示縮寫,後者表示全稱,如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

小小的總結下:

雖然終端經常看起來黑漆漆的算不上美觀,但在這裡使用每條命令也是屬於「人機交互」的範疇,每個命令開發者有不同的理解和習慣,因而形成了不同的參數模式。我也不知道哪種形式更好,也許,仔細觀察認真思考後會更好吧 :D

另外,還沒寫完就發現 @E78E84 的回答,他的回答更準確、學術,推薦知友閱讀

感謝您的閱讀,如果對使用 Mac 軟硬體使用感興趣,可以關注我的專欄《邁客隨記 —— 我和 Mac 的日常》,請點贊鼓勵我分享更多內容 :D


都是參數。一個命令後會有若干個參數組,每個參數組大概有幾種形式:

  • 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三個字元串,怎麼解析這三個字元串,就全憑程序員喜好了。


推薦閱讀:
相關文章