2017-08-26 46 views
0

在Linux命令行中,可以使用兩種方法之一將選項傳遞給命令。我們可以使用簡短選項格式,該格式使用單個破折號後跟單個字母,例如:-o或使用兩個連續破折號後跟一個單詞的長選項格式,例如:--option。但最近我遇到了一些命令,這些命令在我的思維中使用了這兩種格式的「混合」格式,後面使用單個短劃線,例如:-option。現在我不是在討論一個可以將多個短期選項粘在一起的命令,如ls -lisa。我正在談論的是選項,單個短劃線之後的單詞只是一個選項,而不是多個短期選項串在一起。bash中命令的3選項語法之間的區別

我似乎不明白爲什麼有第三種選擇。因爲我對Linux命令行的瞭解只有短格式或長格式。第三種格式來自哪裏?

這實際上令人困惑,因爲有時您不能確定第三種格式是真正的破折號,後跟一個選項還是短劃線,後跟多個短期選項。

+2

你忘了第四個選項,根本沒有破折號。但是這些都與bash無關。 –

+1

所有這些選項都只是約定。 Bash和其他所有shell在執行程序時並不關心破折號 - 程序可以。你可以編寫一個程序,它只接受作爲選項傳遞的選項 - :) :) – Socowi

+0

StackOverflow是關於幫助人們修復他們現有的編程代碼。關於編程理念,教程,研究,工具,建議,庫和代碼的討論請求是無關緊要的。 ***請***閱讀http://stackoverflow.com/help/how-to-ask,http://stackoverflow.com/help/dont-ask,http://stackoverflow.com/help/mcve和參加[旅遊](http://stackoverflow.com/tour),然後在此發佈更多Q​​.祝你好運。 – shellter

回答

3

這不是一個bash問題。所有程序都有處理選項/標誌的方法。有許多不同的風格:

  • 的燒灼字母風格,配有一個連字符,例如: ls -l

  • 助記符風格的雙破折號,這似乎爲GNU-東西的偏愛,對例如,ls --size

  • variable=value式的,例如dd if=file of=otherfile

  • 選項沒有破折號,如tar cvzf arghive.tgz

  • 你甚至可以使用的一個+代替-(如date +%m)。

等等。

理解bash只是將這些選項傳遞給程序/命令很重要。因此,在您將通常看到的程序中:

int main(int argc, char *argv[]){ 

(c代碼示例)。在這種情況下,argv[0]將指向程序名稱(以簡化一些事情)並且argv[1]將指向第一個參數。根據計劃,這可能會有所不同。

通過內置命令的快速掃描發現內置插件似乎總是使用負單字母(-a)來指定選項。

+0

除了'測試',但這是爲了與sh兼容。 –

2

我認爲你很困惑哪個組件會執行解析的哪一部分。

您鍵入bash的命令行會被解析兩次。首先它被bash解析。在這個階段,空格被用來分隔不同的參數。行情和逃跑正在考慮之中。通配符被擴展,並且$變量被替換。

在這個階段結束時,我們剩下一個命令行,它有一個字符串列表,其中第一個描述了要執行的命令。在這一點上,bash調用execve,並將它傳遞給字符串列表。

解析的下一個階段是可選的,取決於每個程序的執行情況。大多數程序調用getopt_long,這是一個解析選項的庫函數。你提到的一兩破折號慣例是由它應用的(以及它的老同胞,getopt)。

然而,每個程序都要解析自己的參數。許多程序使用getopt_long,這就是爲什麼你覺得這是一個標準。但有些人卻沒有。那些不按照自己的方式。

這就是事情的方式。

對於您的程序,您應該嘗試使用getopt_long或某種兼容解決方案,因爲這會對用戶造成最少的混淆。

相關問題