GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer que el asterisco '*' en Zsh tenga el mismo comportamiento que Bash?

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.

Relacionado:Atajos de teclado de alias ZSH
Linux
  1. Cómo poner a cero las variables numéricas en zsh (¿y tal vez también en bash?)

  2. ¿Cómo puedo obtener valores únicos de una matriz en Bash?

  3. ¿Cómo obtengo el directorio absoluto de un archivo en bash?

  4. ¿Cómo obtener el porcentaje de uso del procesador con bash?

  5. ¿Cómo obtener elementos de la lista en bash?

Cómo escribir un bucle en Bash

Cómo comentar en Bash

Cómo ejecutar un script Bash

Cómo obtener el estado de salida de un bucle en bash

¿Cómo obtener la fecha/hora de creación del archivo en Bash/Debian?

Linux/bash:¿Cómo obtener la dirección IPv6 de la interfaz?