usando traço único com nome longo [fechado]

0

Eu sei que um único traço vai com um caractere quando definimos opções usando getopt ou optparse. mas existe alguma maneira de usar um único traço com mais de um caractere, como -apply ?

Eu sei que um único traço se refere a um nome curto e, convencionalmente, as pessoas usam um caractere para isso. mas existem alguns comandos (por exemplo, find -printf ) que usam nome longo com um único traço.

Alguém sabe como usar nome longo com um único traço no bash no Linux (usando getopt ou optparse outras ferramentas bash)?

    
por Lena 24.08.2016 / 15:06

3 respostas

2

Na % man_de% página de manual:

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

Ou, se estivermos falando das funções getopt C:

getopt_long_only() is like getopt_long(), but '-' as well as "--" can indicate a long option
    
por 24.08.2016 / 15:14
0

Se você tem um sistema GNU e deseja opções longas de traço único, use getopt_long ou getopt -a .

O exemplo de find -printf foi o que me levou a notar sobre as extensões GNU: As opções de um traço para find existem fora dos sistemas GNU também, e a herança é provavelmente muito mais antiga que a do estilo GNU longo opções. Portanto, programas como find provavelmente não usam getopt_long , mas apenas analisam manualmente suas opções de linha de comando. No bash, pode parecer algo assim:

$ 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
    
por 24.08.2016 / 16:26
0

A dificuldade em analisar a opção de caractere único é que eles podem ser empacotados (por exemplo, -ab é equivalente a -a -b ). As opções longas do estilo GNU têm a dificuldade que os argumentos podem ser unidos ou não. Com opções de vários caracteres de traço único, não há qualquer dificuldade de análise para que você possa facilmente fazer isso manualmente.

A maioria dos programas com opções de vários caracteres de traço único recebe argumentos em um argumento de linha de comando separado.

foo=
bar=default
require_argument () {
  if [ $# -eq 2 ]; then
    echo >&2 "$0: Option $1 requires an argument"
    exit 2
  fi
  eval "$1=\"\\""
}
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

Considere a possibilidade de usar opções longas no estilo GNU. Eles têm um comportamento mais padronizado e mais pessoas estão familiarizadas com eles.

    
por 25.08.2016 / 01:33

Tags