Blog Linux Avante

Como usar o grep para pesquisar a saída --help e descobrir o que os argumentos CLI que começam com um traço fazem

17 de fevereiro de 2021

Já viu um comando com uma longa lista de argumentos enigmáticos de uma letra que começam com traço/hífen e queria uma maneira rápida de descobrir o que cada argumento da linha de comando faz? Este artigo explica como fazer isso.

Descubra o que um ÚNICO argumento de linha de comando que começa com um traço faz pesquisando o --help do programa

Usando grep para pesquisar a saída --help desta forma falha:

$ rm --help | grep -r

Usage: grep [OPTION]... PATTERNS [FILE]...

Try 'grep --help' for more information.

Isso porque grep trata -r como um argumento para si mesmo, e não como um padrão de pesquisa. Então, qual é a maneira correta de usar grep para pesquisar a saída --help para argumentos que começam com um travessão?

Vamos começar com um exemplo simples com apenas um argumento de linha de comando que começa com um travessão/hífen. Digamos que queremos descobrir o que significa o argumento -r do comando rm -r. Pesquise o rm --help usando grep da seguinte maneira:

Comandos para usar no terminal

rm --help | grep -w -- -r

Que produz o seguinte:

-r, -R, --recursive   remove directories and their contents recursively

By default, rm does not remove directories.  Use the --recursive (-r or -R)

-- é muito importante aqui. O traço duplo (--) sinaliza o fim das opções para aquele comando específico (o fim dos sinalizadores de linha de comando), após o qual apenas os argumentos posicionais são aceitos. Dessa forma, grep não tenta interpretar o que segue o traço duplo como uma opção/flag.

O argumento grep -w é usado para corresponder apenas a palavras inteiras, portanto, por exemplo, ele corresponde apenas a -r, e não a -rALGUMACOISA.

Uma alternativa que você pode usar em vez do traço duplo é -e. Por exemplo, grep -w -e -r (ou grep -we -r) teria o mesmo resultado que grep -w -- -r no exemplo acima. -e permite especificar um padrão de pesquisa e pode ser usado para proteger um padrão que comece com um traço (-). Outra maneira de conseguir isso é escapar do traço do argumento usando \\ (por exemplo, \\-r), usando "\-r", etc.

Isso também funciona com argumentos de linha de comando que começam com 2 traços, mas não usei isso em um exemplo, pois esses argumentos geralmente são autoexplicativos (por exemplo, --help).

Você também pode gostar de: Cod: Novo daemon de preenchimento automático de linha de comando para Bash e Zsh que detecta o uso de --help

Descubra o que MÚLTIPLOS argumentos de linha de comando de uma letra fazem pesquisando o programa --help

Para o segundo exemplo, usaremos grep para pesquisar rm --help para o que as opções -r e -f fazem de uma só vez:

Comandos para usar no terminal

rm --help | grep -w -- '-[rf]'

Que tem a seguinte saída:

-f, --force           ignore nonexistent files and arguments, never prompt
  -r, -R, --recursive   remove directories and their contents recursively
  By default, rm does not remove directories.  Use the --recursive (-r or -R)

-[rf] é um regex, usado para procurar argumentos -r e -f. Você pode adicionar quantos argumentos de linha de comando desejar entre [], e não apenas 2.

Para tornar isso mais fácil de usar, você pode adicionar a seguinte função simples que acabei de criar ao seu ~/.bashrc ou ~/.zsh:

Comandos para usar no terminal

function argshelp() {   ARGS="${@:2}"  $1 --help | grep -w -- "^  -[$ARGS]"}

E, em seguida, use (após obter o arquivo, por exemplo, source ~/.bashrc) o seguinte para pesquisar a ajuda de um COMANDO para ver a explicação dos ARGUMENTOS:

Comandos para usar no terminal

argshelp COMANDO ARGUMENTOS

Exemplo:

Comandos para usar no terminal

argshelp rm rf

Ou:

Comandos para usar no terminal

argshelp ls l a

Como você pode ver, ao usar esta função, os parâmetros do comando não devem começar com um travessão. Você pode especificar os parâmetros separados por um espaço ou juntos. Além disso, você pode renomear esta função para qualquer coisa que desejar (apenas certifique-se de que ainda não seja usada por um comando, atalho, etc.)

Você também pode gostar de: Como encontrar arquivos modificados nos últimos N dias ou minutos usando find

Extras

É importante notar que, em alguns casos, mesmo usando o argumento -w (corresponder apenas a palavras inteiras) grep, você ainda pode obter correspondências indesejadas. Por exemplo. você pode querer apenas a explicação do argumento -l de ls --help, e ainda ls --help | grep -w -- -l resulta em:

--author               with -l, print the author of each file
      --block-size=SIZE      with -l, scale sizes by SIZE when printing them;
                               with -l: show ctime and sort by name;
      --format=WORD          across -x, commas -m, horizontal -x, long -l,
                               single-column -1, verbose -l, vertical -C
      --full-time            like -l --time-style=full-iso
  -g                         like -l, but do not list owner
  -h, --human-readable       with -l and -s, print sizes like 1K 234M 2G etc.
  -l                         use a long listing format
  -n, --numeric-uid-gid      like -l, but list numeric user and group IDs
  -o                         like -l, but do not list group information
                             with -l, WORD determines which time to show;
      --time-style=TIME_STYLE  time/date format with -l; see TIME_STYLE below
                               with -l: show access time and sort by name;

Visto que a maioria das páginas --help têm argumentos que começam com dois espaços, você pode usar essas informações para capturar apenas as linhas que começam com aquele argumento de linha de comando específico e excluir outras correspondências (exemplo para o mesmo comando ls):

Para pesquisar um único argumento de linha de comando (-l):

Comandos para usar no terminal

ls --help | grep -w -- '^ -l'

Que produz:

-l                         use a long listing format
Para pesquisar vários argumentos de linha de comando (-l e -a):

Comandos para usar no terminal

ls --help | grep -w -- '^  -[la]'

Que tem a seguinte saída:

-a, --all                  do not ignore entries starting with .  -l                         use a long listing format

^ indica para corresponder apenas as linhas que começam com o que segue o símbolo ^; aqui, ^ é seguido por 2 espaços.

É possível, com a ajuda de uma ferramenta de linha de comando, explicar o que um argumento faz em várias linhas. Nesse caso, você pode dizer a grep para listar linhas extras abaixo da linha correspondida, usando -A (da ajuda grep: -A NUM "imprime NUM linhas de contexto final"). Por exemplo, para pesquisar na ajuda do comando cp o que a opção -f faz e imprimir 2 linhas de contexto final, use:

Comandos para usar no terminal

cp --help | grep -w -A2 -- -f

Que tem esta saída:

-f, --force
               if an existing destination file cannot be
               opened, remove it and try again (this option
               is ignored when the -n option is also used)

Também devo mencionar explainshell.com aqui, um site onde você pode escrever um comando para ver o texto de ajuda que corresponde a cada argumento.

Você também pode gostar de: Como repetir um comando a cada X segundos no Linux

via @nixcraft

Confira a versão original desse post em inglês
Propaganda
Blog Comments powered by Disqus.
Propaganda