Options

為什麼可以省略選項和參數之間的空格?

  • June 27, 2016

例如:

xargs -n 1

是相同的

xargs -n1

但是如果您查看手冊頁,該選項被列為-n max-args,這意味著應該保留空間。縮寫形式 -n max-args沒有任何內容。

許多其他 Linux 實用程序也會發生這種情況。

這在 Linux 中叫什麼?是否所有實用程序都支持縮寫形式(但從不在手冊頁中記錄它)?

當您編寫程式碼的命令行解析位時,您指定哪些選項帶參數,哪些不帶參數。例如,在一個接受一個-h選項(例如幫助)和一個-a應該接受參數的選項的 shell 腳本中,你可以

opt_h=0     # default value
opt_a=""

while getopts 'a:h' opt; do
   case $opt in
       h)  opt_h=1 ;;
       a)  opt_a="$OPTARG" ;;
   esac
done

echo "h: $opt_h"
echo "a: $opt_a"

a:h位表示“我期望解析兩個選項,-a並且-h, 並且-a應該接受一個參數”(它告訴解析器:接受一個參數)。a``-a

因此,期權在哪裡結束,它的價值從哪裡開始,以及另一個期權在哪裡開始,永遠不會有任何歧義。

執行它:

$ bash test.sh -h -a hello
h: 1
a: hello

$ bash test.sh -h -ahello
h: 1
a: hello

$ bash test.sh -hahello
h: 1
a: hello

這就是為什麼您大多數時候不應該編寫自己的命令行解析器來解析選項的原因。

這個例子中只有一種情況比較棘手。解析通常在第一個非選項處停止,所以當你在命令行上有看起來像選項的東西時:

$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello

以下解決了這個問題:

$ bash test.sh -a hello -- -world
h: 0
a: hello

--信號表示命令行選項的結束,並且該-world位留給程序做它想做的任何事情(它在位置變數之一中)。

也就是說,順便說一下,如何刪除文件名開頭帶有破折號的文件rm

編輯

用 C 呼叫getopt()(在 中聲明unistd.h)編寫的實用程序,其工作方式幾乎相同。事實上,就我們所知,該bash函式getopts可以通過呼叫 C 庫函式來實現getopt()。Perl、Python 和其他語言具有類似的命令行解析庫,並且它們很可能以類似的方式執行它們的解析。

其中一些和類似getoptgetopt庫常式也處理“長”選項。這些通常以雙破折號 ( --) 開頭,帶參數的長選項通常在等號之後執行,例如--block-size=SIZE選項

$$ some implementations of $$du實用程序(它也允許-B SIZE指定相同的東西)。 手冊經常被寫成在短選項和它們的論點之間顯示一個空格的原因可能是為了便於閱讀。

編輯真正的舊工具,例如ddtar實用程序,在它們前面有沒有破折號的選項。這純粹是出於歷史原因,也是為了保持與依賴它們以這種方式工作的軟體的兼容性。該tar實用程序最近獲得了使用破折號選擇選項的能力。BSD 手冊tar呼叫“捆綁標誌”的舊式選項。

引用自:https://unix.stackexchange.com/questions/292232