Por que o manual do rm diz que podemos executá-lo sem qualquer argumento, quando isso não é verdade?

Por que o manual do rm diz que podemos executá-lo sem qualquer argumento, quando isso não é verdade?

Podemos ver que a sinopse do rmcomando é:

rm [OPTION]... [FILE]...

Isso não significa que podemos usar apenas rmcomandos sem qualquer opção ou argumento?
Quando executo o comando rmsozinho, o terminal mostra o seguinte erro:

rm: missing operand
Try 'rm --help' for more information.

Alguém pode me dizer por que esse é o caso?

Responder1

A sinopse padrão do rmutilitário é especificadano padrão POSIX1 e 2 como

rm [-iRr] file...
rm -f [-iRr] [file...]

Na sua primeira forma, requer pelo menos um operando de arquivo, mas na segunda forma não.

Ficar rm -fsem operandos de arquivo não é um erro:

$ rm -f
$ echo "$?"
0

... mas simplesmente não faz muito.

A norma diz que para a -fopção, a rmconcessionária deve...

Não solicite confirmação. Não grave mensagens de diagnóstico nem modifique o status de saída no caso de operandos sem arquivo ou no caso de operandos inexistentes. Quaisquer ocorrências anteriores da -iopção serão ignoradas.

Isso confirma que deve ser possível executar rm -fsem nenhum operando de nome de caminho e que isso não é algo que faz rma saída com uma mensagem de diagnóstico nem um status de saída diferente de zero.

Este fato é muito útil em um script que tenta excluir vários arquivos como

rm -f -- "$@"

onde "$@"está uma lista de nomes de caminhos que podem ou não estar vazios ou que podem conter nomes de caminhos que não existem.

( rm -fainda gerará uma mensagem de diagnóstico e sairá com um status de saída diferente de zero se houverproblemas de permissãoimpedindo que um arquivo nomeado seja removido.)

Executar o utilitário sem opção nem operandos de nome de caminho é um erro:

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1

O mesmo vale para GNU rm(o acima mostra OpenBSD rm) e outras implementações do mesmo utilitário, mas a mensagem de diagnóstico exata e o status de saída diferente de zero podem ser diferentes (no Solaris o valor é 2 e no macOS é 64, por exemplo).

Concluindo, o rmmanual do GNU pode ser um pouco impreciso, pois é verdade que com alguma opção ( -f, que é uma opção opcional), o operando do nome do caminho é opcional.


1 desde a edição de 2016, após resolução deesse bug, vera edição anteriorpara referência.
2 POSIX é o padrão que define o que é um sistema Unix e como ele se comporta. Esta norma é publicada pelaO Grupo Aberto. Veja também a pergunta "O que exatamente é POSIX?".

Responder2

Tecnicamente, a sinopse está correta, mas é confusa. Há casos em que nenhum nome de arquivo é necessário:

rm --help
rm --version

(ao usar GNU rm). Todos os outros casos requerem um nome de arquivo.

Outras versões rmmostram o arquivo como não opcional,por exemploema página de manual do OpenBSD.

Uma sinopse mais precisa do GNU rmmostraria as três variantes:

rm[opções...]arquivo...
rm --help
rm --version

informação relacionada