git中有的命令參數為什麼使用一個橫杠 - 有的命令卻使用兩個橫杠 -- ?
比如配置用戶名:
git config --global user.name "xxx"
而
git commit -m "xxx"
雖然這個問題可能有點無聊, 但是確是一直困惑我的, 麻煩大神解釋一下
這個問題跟 Git 基本沒關係,這是類 UNIX 系統的命令行約定俗成的參數風格。
(個人理解,有錯誤敬請指出)
具體來說就是命令行參數中,以短杠 - 開頭的都是參數選項 (option) ,分為短選項 (short option) 和長選項 (long option) 兩種。
- 短選項(UNIX 風格):
- 短選項為一個 - 加上一個字母,如:
$ rm -r -f foo
- 多個短選項可以簡寫為一個 - 加上每個短選項的字母,如:
$ rm -rf foo
- 選項後面跟參數的,選項與參數之間可以用空格分隔,也可以不分隔(但是不能用等號):
$ journalctl -b -1
$ journalctl -b-1
- 長選項(GNU 風格):
- 長選項為兩個短杠 -- 加上若干單詞:
$ wc --lines foo
$ git show --name-only
- 長選項不能簡寫;
- 長選項後面跟參數,用空格或等號分隔:
$ grub2-install --boot-directory /boot
$ grub2-install --boot-directory=/boot
上述參數選項規則是目前最常見的風格。當然並不是所有程序都遵循這樣的風格,比如 GCC 用的是老式選項風格,無論長短選項都只用一個短杠:
$ gcc -Wall -Wextra -std=c11 -O3 -o foo foo.c
還有一種風格稱為 BSD 風格,完全就不用短杠……比如 ps 命令的手冊頁寫道:
This version of ps accepts several kinds of options:
1 UNIX options, which may be grouped and must be preceded by a dash.2 BSD options, which may be grouped and must not be used with a dash.3 GNU long options, which are preceded by two dashes. Options of different types may be freely mixed, but conflicts can appear. There are some synonymous options, which are functionally identical, due to the many standards and ps implementations that this ps is compatible with.
(真是喪心病狂……)
命令行用得多了這些東西自然就熟悉了,所以大神們大概都懶得解釋得這麼細緻吧……一般情況下,一個-後面接的是單個字母,兩個-後面接的是單詞
一個-也可能是連字元,譬如git show --name-only兩個--也可能後面不跟參數,僅僅用來表示後面接的是個路徑,以避免歧義。譬如git checkout -- myName,這裡--空格myName表示myName是個文件,而不是branch或者tag。另外,如果myName(文件)已經從git庫里刪掉了,而又想看它的歷史,那麼git log myName是會報錯的,用git log -- myName就可以了補充下,像-a和-v這樣的參數可以合併成-av,譬如git branch -av等於git branch -a -v
一個是參數的簡寫,兩杠是全寫。是類UNIX 的規則。參數參數
參數
如-h. 與--help是相同的。unix api,c語言頭文件,裡面有個getopt,還有個getopt_long,經常就是用這兩個函數來處理命令行參數的(git是不是不知道),這兩個的處理就是分成一個杠和兩個杠,一個是短參數,兩個是長參數,
還有一種情況是用來分隔選項與文件名的:
--
This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for command-line options).
推薦閱讀:
※sourcetree git ssh私鑰問題 如何解決?
※輪子哥都造了哪些輪子?
※如何評論「怎樣尊重一個程序員」?
※linux用什麼同步文件好?