コマンドが特定のオプションを受け入れるかどうかをテストする

コマンドが特定のオプションを受け入れるかどうかをテストする

コマンドにオプションがあるかどうかをテストするための好ましい方法は何ですか?注意事項がありますか?

動機付けの例として、私のシェルエイリアスgrepはログイン時にいくつかの--exclude-dirオプションを追加しますが、このオプションは私がアクセスしているすべてのシステムでは利用できません。

答え1

幸い、潜在的なオプションをプログラムに報告する比較的標準化された方法があります。しかし、常に使用されるわけではないので、これは完璧な答えではなく、単に上級ユーザーが確認した答えです。

$prog --help | grep -e "\b$option\b"

(\ bは単語の境界を表します。つまり、$ optionの後に文字が残らないため、$ option-fは一致しません。)

オプションがある場合は返しますが、より重要な場合は終了ステータス 0 を返し、ない場合は終了ステータス 1 を返します。以下を使用してこれをテストできます。

$ # we pipe to /dev/null to hide the output, and show that it doesn't matter
$ grep --help | grep -e "\b--exclude-dir\b" > /dev/null
$ echo $?
0
$ grep --help | grep -e "\b--exclude-dirf\b" > /dev/null
$ echo $?
1

これは多くのプログラムで機能しますが、みんな--helpがあります...役に立つ。あなたも幸運かもしれません

man $progr | grep -e "\b$option\b"

最初に失敗した場合

答え2

オプションが使用可能で期待通りに機能している場合にのみ、成功したダミーデータに対してテストを実行できます。

trap 'if [ -e "$tmp" ]; then rm -rf -- "$tmp"; fi' EXIT
tmp="$(mktemp -d)"
cd -- "$tmp"
mkdir exclude
mkdir include
echo foo > include/test.txt
echo foo > exclude/test.txt
[ "$(grep --exclude-dir exclude --recursive foo . | wc -l)" -eq 1 ]

答え3

ほとんどの(すべて?)コマンドが不明なオプションで呼び出されたときにゼロより大きい戻りコードで終了することを考えると、次のことを試すことができます。

cmd --option-to-probe [other options and parameters] >/dev/null 2>/dev/null

そして$?ゼロであることを確認してください。

答え4

次のようにコマンドのマニュアルページをgrepして、このオプションが存在するかどうかを確認できます。

CMD=grep
OPTIONS=""
for OPT in "--exclude-dir" "--text" "--not_an_option"; do
  if man $CMD | col -bx | egrep --quiet \\$OPT; then
    OPTIONS="$OPTIONS $OPT"
  fi
done
alias $CMD="$CMD $OPTIONS"

関連情報