將參數傳遞給控制台應用程式的不同方法

將參數傳遞給控制台應用程式的不同方法

為什麼控制台應用程式以以下任一方式取得參數:

a) one dash (myapp -arg1 123; ls -al)
b) two dashes (myapp --arg1 123; git push origin master --force)
c) without dashes at all (myapp 123; man ls)
d) without dashes but with the equal sign (myapp arg1=123; dd if=/dev/zero)

難道沒有一個標準約定嗎?即使在標準 Linux 應用程式中,a)、b) 和 d) 三種情況也確實同時存在。而且很難記住何時應該使用 -help 以及何時使用 --help。

答案1

破折號用於表示選項,它修改命令的行為。不帶破折號的參數表示指令的主要參數,通常是檔名。

單連字符通常引入僅包含一個字母的選項。多個這樣的選項可以組合在一起,因此ls -a -l可以縮寫為ls -al。這是大多數早期 Unix 指令的標準約定。

雙連字符引入整個單字的選項。這項約定對於將它們與上述分組區分開來是必要的。這種選項風格因 GNU 版本的實用程式而流行,因為它們通常具有太多的功能,以致於它們用完了助記符的單個字母。

有時一個選項需要它自己的參數。其風格各不相同:有些指令使用-o parameter,有些指令使用-oparameter,有些指令使用--option=parameter,有些允許多種形式。

還有一些指令發明了自己獨特的參數風格。這些通常是非常古老的命令,來自於參數約定達成共識之前。這方面的例子有tardd。也是不尋常的,因為它是一個在創建約定find之前使用完整單字選項的舊命令;--它的論點其實是一種自己的語言,因為它的需求不符合典型的command -options parameters範式。

命令之間存在差異的其他原因是 Unix 最初沒有參數解析庫函數。直到其生命週期很長一段時間內,getoptgetopts函數才被創建。使用這些庫本質上會迫使您遵循常見做法。但較舊的程式會進行自己的臨時參數解析,並且不同的程式設計師會做出不同的決定。

答案2

@Barmar 是正確的,但缺少一些資訊。為什麼會發生這種情況,完全是因為程式碼的寫方式,更具體地說,是用來解析參數的。

在詳細討論之前,我想澄清一些術語。首先,你所謂的「選項」其實也是參數。事實上,您在命令列中輸入的所有內容都是一個參數(包括程式的名稱)。這些參數通常儲存在一個陣列中(argv在 C 中稱為)。然後,程式選擇如何(或是否)解析這些參數並做出相應的行為。現在,參數通常採用以下三種形式之一:

  1. 標誌(不接受參數;只需打開或關閉行為)
  2. 開關(接受參數;根據參數修改行為)
  3. 參數(純數據不意味著修改行為)

12通常被稱為OPTIONS和 ,旨在改變程序行為,但兩者以不同的風格出現(正如 Barmar 也提到的)。 C 的getopt函式庫其實在這方面提供了很大的靈活性。儘管約定是將選項指定為前面有一個連字符的單個字母或前面有兩個連字符的完整單詞,但使用 編寫的程序getopt實際上允許以下任何一項等效(假設help給出h索引) ):

-h, --h,--help

然而,-help實際上是不允許的getopt(因此,如果一個工具使用-help其使用標誌,那麼您可以非常確定它不是用getopt庫編寫的)。這是因為getopt將單個連字符解釋為表示組合選項列表,因此它解釋-help-h -e -l -p

此外,當選項採用參數(通常稱為「optargs」)時,您可以透過幾種方法來指定它們。以下 - 假設 的索引optoopt需要一個 optarg1—也都是等價的:

-oParameter, -o Parameter, --opt=Parameter,--opt Parameter

儘管該getopt庫現在是一個廣泛使用的標準,但許多早於它的工具(例如tar)仍然使用自己的解析設置,因此 Whytar -xjf相當於tar xjf.


長話短說:getopt並不總是存在,因此程式設計師必須以自己的方式解析參數。但是,較新的工具通常會使用它,因此它們的行為是理智且可預測的。


1 有一種沒有充分記錄的能力,就是選項能夠接受 optarg 但不能要求一。可選的 optargs 會導致各種煩人的事情,並導致一些更常見的指定選項的方法無效(因為它們是不明確的)。幸運的是,採用可選參數的參數並不常見。

答案3

options 以破折號開頭,通常是一個字母,可以指定多個選項

ls -l -h 
or
ls -lh

options 以兩個破折號開頭,一般帶單詞,多個選項不行

ls --list --human

相關內容