Qué está pasando
El shell (bash) ve el argumento [a-z]
. Ese es un patrón comodín (un globo ), que coincide con cualquier letra minúscula¹. Por lo tanto, el shell busca un nombre de archivo que coincida con este patrón. Hay tres casos:
- Ningún archivo en el directorio actual tiene un nombre que sea una letra minúscula. Luego, el shell deja el patrón comodín sin cambios y
tr
ve los argumentos -d
y [a-z]
. Esto es lo que sucede en la mayoría de sus máquinas.
- Un solo archivo en el directorio actual tiene un nombre que es una letra minúscula. Luego, el shell expande el patrón a este nombre de archivo y
tr
ve los argumentos -d
y el nombre del archivo. Esto sucede en el servidor, y se llama al archivo correspondiente o
ya que podemos ver que tr
eliminó la letra o
.
- Dos o más archivos en el directorio actual tienen un nombre que es una letra minúscula. Luego, el shell expande el patrón a la lista de nombres de archivos coincidentes y
tr
ve tres o más argumentos: -d
y los nombres de los archivos. Como tr
espera un único argumento después -d
, se quejará.
Lo que deberías haber hecho
Si hay caracteres especiales en el argumento de un comando, debe escapar de ellos. Ponga el argumento entre comillas simples '…'
(esta es la forma más simple, hay otras). Dentro de las comillas simples, todos los personajes se representan a sí mismos, excepto la comilla simple. Si hay una comilla simple dentro del argumento, reemplácela por'\''
.
tr -d '[a-z]'
Sin embargo, tenga en cuenta que esto probablemente no sea lo que quería decir. Esto le indica tr
que elimine las letras minúsculas y los corchetes. Es equivalente a tr -d ']a-z['
, tr '[]a-z'
, etc. Para eliminar letras minúsculas, el uso
tr -d a-z
El argumento para tr
es un conjunto de caracteres. Pone corchetes alrededor de un conjunto de caracteres en una expresión regular o patrón comodín para indicar que es un conjunto de caracteres. Pero tr
funciona en un solo personaje a la vez. Sus argumentos de línea de comando son lo que pondría dentro de los corchetes .
Necesita paréntesis para indicar las clases de caracteres . En una expresión regular, utiliza corchetes dentro de corchetes para indicar una clase de caracteres, por ejemplo, [[:lower:]]*
coincide con cualquier número de letras minúsculas, [[:lower:]_]*
coincide con cualquier número de letras minúsculas y guiones bajos. En el argumento de tr
, necesita el conjunto sin sus corchetes circundantes, por lo que tr -d '[:lower:]'
elimina letras minúsculas, tr -d '[:lower:]_'
elimina letras minúsculas y guiones bajos, etc.
¹ En algunos entornos locales puede coincidir con otros caracteres .
tr
rangos se escriben sin encerrar[...]
. Asítr -d '[a-z]'
mataráa-z
, y también personajes[
y]
. Usetr -d a-z
para matar solo letrasa-z
.