長い名前で単一ダッシュを使用する

長い名前で単一ダッシュを使用する

getoptまたはoptparseを使用してオプションを設定すると、1つのダッシュが1文字に対応することがわかります。しかし、とにかく複数の文字に単一のダッシュを使用できますか-apply

ダッシュは短い名前を表し、一般に人々はこれを表すために1つの文字を使用することを知っています。ただし、一部のコマンド(たとえばfind -printf)は、単一のダッシュを含む長い名前を使用します。

Linuxのbashでダッシュで長い名前を使用する方法を知っている人はいますか(getoptまたはoptparse他のbashツールを使用して)?

答え1

~からgetoptマンページ:

-a, --alternative
        Allow long options to start with a single '-'.

または私たちが話している場合getopt*C機能:

getopt_long_only() is like getopt_long(), but '-' as well as "--" can indicate a long option

答え2

GNUシステムがあり、単一のダッシュロングオプションが必要な場合は、必ずまたはgetopt_longを使用してくださいgetopt -a

この例はfind -printfGNU 拡張に私の関心を集めました。findワンダッシュオプションはGNUシステムの外に存在し、その遺産はおそらくGNUスタイルの長いオプションよりもはるかに古いでしょう。したがって、このようなプログラムは をfind使用せずにgetopt_longコマンドラインオプションを手動で解析できます。 Bashでは、次のように見えます。

$ cat args.sh
#!/bin/sh
foo=0
bar=0
while [ "$#" -ne 0 ] ; do 
        if [ "$1" = "-foo" ] ; then
                foo=1
        elif [ "$1" = "-bar" ] ; then
                shift
                bar=$1
        fi
        shift
done
echo foo: "$foo"
echo bar: "$bar"
$ ./args.sh -bar x -foo
foo: 1
bar: x

答え3

単一文字オプションを解析する際の難点は、バンドルで囲むことができることです(例:-abと同じ-a -b)。 GNU スタイルの長いオプションの 1 つの難しさは、引数が連結されていても連結されていなくてもよいことです。単一ダッシュマルチ文字オプションを使用すると、解析に問題がなく、手動で簡単に実行できます。

単一ダッシュマルチ文字オプションを持つほとんどのプログラムは、個別のコマンドライン引数として引数を受け入れます。

foo=
bar=default
require_argument () {
  if [ $# -eq 2 ]; then
    echo >&2 "$0: Option $1 requires an argument"
    exit 2
  fi
  eval "$1=\"\$3\""
}
while case "$1" in
        --) shift; false;;
        -foo) foo=1 
        -bar) require_argument bar "$@"; shift;;
        -?*) echo >&2 "$0: Unknown option $1"; exit 2;;
        *) false;;
      esac
do
  shift
done

GNUスタイルの長いオプションを試してください。彼らの行動はより標準化され、より多くの人々がこれに慣れてきました。

関連情報