Análise de opções de linha de comando

2

Para o projeto da escola, eu tenho que implementar um aplicativo shell / terminal. Mas eu estou querendo saber como as opções de linha de comando são analisadas, porque parece um pouco estranho ser. Por exemplo, para o comando colar (e acredito que outros utilitários se comportam de maneira semelhante)

[jiewmeng@JM tmp]$ paste --help
Usage: paste [OPTION]... [FILE]...

Comportamento ao combinar várias opções em uma

[jiewmeng@JM tmp]$ paste -ds file1
file1 xxx
file1
d aaws dafd a

Aqui parece que as opções são simplesmente ignoradas ...

[jiewmeng@JM tmp]$ paste -sd file1

Ele se comporta da mesma forma que paste - , aguardando stdin . Mas quando sua combinação válida

[jiewmeng@JM tmp]$ paste -sd. file1
file1 xxx.file1.d aaws dafd a

Funciona. Não deveria o inválido dar um erro em vez de esperar por stdin ?

[jiewmeng@JM tmp]$ paste -d
paste: option requires an argument -- 'd'
Try 'paste --help' for more information.

Ok, faz sentido d exige um argumento, mas ...

[jiewmeng@JM tmp]$ paste -d file1

... aguarda stdin . porque?

    
por Jiew Meng 16.02.2014 / 03:52

2 respostas

2

paste -d aceita um argumento obrigatório.

Veja a página de manual

     -d, --delimiters=LIST
          reuse characters from LIST instead of TABs

Este formato realmente significa

     -d LIST or --delimiters=LIST
          reuse characters from LIST instead of TABs

Portanto, com paste -d file1 , você está definindo LIST para file1 e nenhum nome de arquivo é especificado. E como a man page diz:

    With no FILE, or when FILE is -, read standard input.

Com paste -ds file1 , você está definindo um delimitador para s . Você teria que fornecer vários arquivos para ver o efeito.

Compare

$ paste <(printf 'foo\nbar\n') <(printf 'one\ntwo\n') 
foo<TAB>one
bar<TAB>two
$ paste -ds <(printf 'foo\nbar\n') <(printf 'one\ntwo\n')
foosone
barstwo
    
por 16.02.2014 / 03:58
5

Acho geralmente confuso olhar o conjunto existente de ferramentas para tentar entender como os argumentos de linha de comando funcionam.

Por que você pode perguntar?

Bem, há muitas situações em que o autor de uma determinada ferramenta de linha de comando apresenta argumentos de linha de comando para o usuário, o que faz mais sentido para sua ferramenta. Então, consequentemente, as opções podem ser bastante complexas e confusas até você ter sua cabeça em torno delas.

Não me entenda mal, é bom obter uma apreciação das diferentes maneiras pelas quais as opções podem ser apresentadas, mas, ao iniciar, provavelmente é melhor começar com uma ferramenta real que seria usada para analisar argumentos de linha de comando, como como getopts .

getopts

Então eu sugiro dar uma olhada em getopts , ele é incluído no Bash se você quiser obter uma apreciação de como seria analisar seus próprios argumentos de linha de comando se eles estivessem construindo um script de shell que exigisse análise de argumentos.

Exemplo

#!/bin/sh

# Initialize our own variables:
output_file=""
verbose=0

OPTIND=1 # Reset is necessary if getopts was used previously in the script.
         # It is a good idea to make this local in a function.

while getopts "hvf:" opt; do
    case "$opt" in
        h)
            show_help
            exit 0
            ;;
        v)  verbose=1
            ;;
        f)  output_file=$OPTARG
            ;;
        '?')
            show_help >&2
            exit 1
            ;;
    esac
done
shift $((OPTIND-1)) # Shift off the options and optional --.

echo "verbose=$verbose, output_file='$output_file', Leftovers: $@"

# End of file
    
por 16.02.2014 / 04:22