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.
--help
do programaUsando 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:
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
--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:
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
:
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:
argshelp COMANDO ARGUMENTOS
Exemplo:
argshelp rm rf
Ou:
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
É 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
):
-l
):ls --help | grep -w -- '^ -l'
Que produz:
-l use a long listing format
-l
e -a
):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:
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
Esse post foi traduzido do site LinuxUprising.com pela rtland.team.
Confira a versão original desse post em inglês:
How To Use grep To Search The --help Output To Find Out What CLI Arguments That Begin With A Dash Do