O que está acontecendo
O shell (bash) vê o argumento [a-z]
. Esse é um padrão curinga ( glob ), que corresponde a qualquer letra minúscula¹. Portanto, o shell procura um nome de arquivo que corresponda a esse padrão. Existem três casos:
- Nenhum arquivo no diretório atual tem um nome que é uma única letra minúscula. Em seguida, o shell deixa o padrão curinga inalterado e
tr
vê os argumentos -d
e [a-z]
. É o que acontece na maioria das suas máquinas.
- Um único arquivo no diretório atual tem um nome que é uma única letra minúscula. Em seguida, o shell expande o padrão para esse nome de arquivo e
tr
vê os argumentos -d
e o nome do arquivo. Isso acontece no servidor e o arquivo correspondente é chamado, o
pois podemos ver que tr
a letra foi excluída o
.
- Dois ou mais arquivos no diretório atual têm um nome que é uma única letra minúscula. Em seguida, o shell expande o padrão para a lista de nomes de arquivos correspondentes e
tr
vê três ou mais argumentos: -d
e os nomes dos arquivos. Como tr
espera um único argumento depois -d
, ele irá reclamar.
O que você deveria ter feito
Se houver caracteres especiais no argumento de um comando, você deverá escapar deles. Coloque o argumento entre aspas simples '…'
(esta é a maneira mais simples, existem outras). Dentro de aspas simples, todos os caracteres se representam, exceto a própria aspas simples. Se houver uma aspas simples dentro do argumento, substitua-o por'\''
.
tr -d '[a-z]'
No entanto, note que isso provavelmente ainda não é o que você quis dizer! Isso indica tr
para excluir letras minúsculas e colchetes. É equivalente a tr -d ']a-z['
, tr '[]a-z'
etc. Para excluir letras minúsculas, use
tr -d a-z
O argumento para tr
é um conjunto de caracteres. Você coloca colchetes em torno de um conjunto de caracteres em uma expressão regular ou padrão curinga para indicar que é um conjunto de caracteres. Mas tr
funciona em um único personagem de cada vez. Seus argumentos de linha de comando são o que você colocaria dentro dos colchetes .
Você precisa de colchetes para indicar as classes de caracteres . Em uma expressão regular, você usa colchetes entre colchetes para indicar uma classe de caracteres, por exemplo, [[:lower:]]*
corresponde a qualquer número de letras minúsculas, [[:lower:]_]*
corresponde a qualquer número de letras minúsculas e sublinhados. No argumento de tr
, você precisa do conjunto sem os colchetes, portanto, tr -d '[:lower:]'
exclui letras minúsculas, tr -d '[:lower:]_'
exclui letras minúsculas e sublinhados, etc.
¹ Em alguns locais, pode corresponder a outros caracteres .
tr
intervalos são gravados sem o anexo[...]
. Entãotr -d '[a-z]'
vai matara-z
, e também personagens[
e]
. Usetr -d a-z
para matar apenas letrasa-z
.