Teste se o comando aceita uma opção específica

3

Qual é a maneira preferida de testar se um comando usa uma opção? Quais são as ressalvas?

Como um exemplo motivador, no login meus aliases shell grep para adicionar várias opções --exclude-dir, mas esta opção não está disponível em todas as máquinas que eu acesso.

    
por Praxeolitic 10.09.2014 / 17:33

4 respostas

3

Você pode fazer um teste em dados fictícios que devem ser bem-sucedidos se, e somente se, a opção estiver disponível e funcionando como esperado:

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 ]
    
por 10.09.2014 / 17:43
5

Felizmente, existe uma maneira relativamente padronizada de relatar possíveis opções para os programas. No entanto, nem sempre é usado, portanto, essa não é uma resposta à prova de erros; apenas uma resposta à prova de poweruser.

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

(note que \ b significa limite de palavra. Assim, não haverá mais caracteres após sua opção $, portanto, $ option-f não corresponderá)

Isso retornará a você a opção, se ela existir - mas, mais importante, retornará um status de saída igual a 0, se existir, ou um status de saída igual a 1, se não existir. Você pode testar isso com:

$ # 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

Isso funcionará em muitos programas, mas todos têm um --help que é ... útil . Você também pode ter sorte com

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

se o primeiro falhar

    
por 10.09.2014 / 17:57
3

Dado que a maioria dos comandos (todos?) sai com um código de retorno maior que zero quando chamado com opções desconhecidas, você pode tentar

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

e verifique se $? é 0 ou não.

    
por 10.09.2014 / 19:00
1

Você pode usar a página man do comando para ver se a opção está lá, algo assim:

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"
    
por 10.09.2014 / 18:22