A convenção é que tudo o que começa com -
é uma opção. Isso colide com nomes de arquivos que começam com -
. Para contornar essa maioria dos comandos, reconheça --
como sentinela de fim de opções. Tudo após o --
não será reconhecido como opções, em vez disso, serão considerados literalmente como nomes de arquivos.
Por exemplo
cat -- --1
ou
rm -rf -- --1
Outro método é qualificar o nome do arquivo com um caminho.
por exemplo
cat ./--1
ou até mesmo
cat /home/username/foo/--1
O melhor é nunca criar nomes de arquivos que comecem com -
. Os nomes dos arquivos podem conter todos os tipos de caracteres, incluindo a nova linha, mas somente porque é possível, não significa que você tenha que fazê-lo.
Para responder à sua pergunta: Por que os comandos cat, grep e outros não conseguem entender os arquivos que começam com o sinal de menos? Porque a linha de comando é apenas uma string. O shell faz alguma expansão de nome de arquivo e alguma divisão de palavras e alguma substituição de variável, mas no final o programa recebe um array de strings.
Como você separa as strings que significam opções das strings que significam nomes de arquivos? Por alguns personagens sentinelas. A convenção no mundo unix / linux é usar o -
como o caractere sentinela. Tudo o que começa com -
é uma opção. Bem, quase tudo. Os argumentos para as opções também podem começar com -
, mas esse é o detalhe do programa individual.
Nem todo programa está em conformidade com esta convenção. Indiscutivelmente o exemplo mais popular é dd
:
dd if=/dev/random of=whatfreespace
dd
reconhece nomes de arquivos porque aparecem após o sinal =
.
A maioria, se não todos, os programas GNU estão de acordo com a convenção GNU getopt: opções curtas começam com -
e são apenas um caractere, as opções longas começam com --
e são pelo menos dois caracteres. --
sozinhos marca o final das opções e todas as strings depois dessa marca não são reconhecidas como opções. Para mais detalhes, leia Convenções de Sintaxe do Argumento do Programa na GNU libc manual.
Um exemplo de um programa que está parcialmente de acordo com a convenção GNU é find
:
find -not -name porn -delete
Embora find
use -
para diferir de opções de não opções, elas não diferem de opções longas de opções curtas. Ele reconhece --
como o final das opções. Cada programa pode definir sua própria maneira de reconhecer opções e nomes de arquivos e qualquer outra coisa.
A convenção para interpretar um único -
como stdin também é apenas isso, uma convenção de como interpretar o único caractere -
quando ele é encontrado na matriz de cadeias de caracteres.