Recientemente cambié de bash a zsh y ahora cuando escribo
ls *
No enumera simplemente todos los archivos en este directorio, sino que muestra un árbol de dos niveles.
También
rm -rf somepath/*
falla con la salida zsh: no matches found:
Esto solía funcionar bien con bash. ¿Alguien puede ayudarme a recuperar este comportamiento?
Tengo oh-my-zsh instalado.
Respuesta aceptada:
ls *
tendría el mismo efecto en bash. No importa cuál sea el shell, lo que sucede es que el shell primero expande los comodines y luego pasa el resultado de la expansión al comando. Por ejemplo, suponga que el directorio actual contiene cuatro entradas:dos subdirectorios dir1
y dir2
y dos archivos regulares file1
y file2
. Luego, el shell expande ls *
a ls dir1 dir2 file1 file2
. Los ls
El comando primero enumera los nombres de los argumentos que no son directorios existentes, luego enumera el contenido de cada directorio a su vez.
$ ls
dir1 dir2 file1 file2
$ ls -F
dir1/ dir2/ file1 file2
$ ls *
file1 file2
dir1:
…
dir2:
…
Si ls
se comportó de manera diferente en bash, ya sea que haya cambiado la configuración de bash para desactivar las expansiones comodín, lo que las desactivaría en todas partes, o haya cambiado el significado de ls
comando para suprimir la lista de directorios, probablemente con un alias. Específicamente, tener
alias ls='ls -d'
en tu ~/.bashrc
Tendría exactamente el efecto que describes. Si eso es lo que hiciste, puedes copiar esta línea a ~/.zshrc
y tendrás el mismo efecto.
El hecho de que rm -rf somepath/*
tiene un efecto diferente en bash y zsh cuando somepath
es un directorio vacío es un asunto completamente diferente.
En bash, si somepath/*
no coincide con ningún archivo, bash deja el patrón comodín en el comando, por lo que rm
ve los argumentos -rf
y somepath/*
. rm
intenta borrar el archivo llamado *
en el directorio somepath
, y dado que no existe tal archivo, este intento falla. Desde que pasaste la opción -f
a rm
, no se queja de la falta de un archivo.
En zsh, de forma predeterminada, si un comodín no coincide con ningún archivo, zsh lo trata como un error. Puede cambiar la forma en que se comporta zsh desactivando la opción nomatch
:
setopt no_nomatch
No recomiendo esto porque hacer que el shell le diga cuándo un comodín no coincide suele ser el comportamiento preferible en la línea de comandos. Hay una forma mucho mejor de decirle a zsh que, en este caso, una lista vacía está bien:
rm -rf somepath/*(N)
N
es un calificador global que dice expandirse a una lista vacía si el comodín no coincide con ningún archivo.