Je suis récemment passé de bash à zsh et maintenant quand je tape
ls *
Il ne se contente pas de lister tous les fichiers de ce répertoire, mais affiche une arborescence à deux niveaux.
Aussi
rm -rf somepath/*
échoue avec la sortie zsh: no matches found:
Cela fonctionnait très bien avec bash. Quelqu'un peut-il m'aider à récupérer ce comportement ?
J'ai installé oh-my-zsh.
Réponse acceptée :
ls *
aurait le même effet dans bash. Quel que soit le shell, ce qui se passe, c'est que le shell développe d'abord les caractères génériques, puis transmet le résultat de l'expansion à la commande. Par exemple, supposons que le répertoire courant contienne quatre entrées :deux sous-répertoires dir1
et dir2
, et deux fichiers normaux file1
et file2
. Ensuite, le shell développe ls *
vers ls dir1 dir2 file1 file2
. Le ls
La commande répertorie d'abord les noms des arguments qui ne sont pas des répertoires existants, puis répertorie le contenu de chaque répertoire tour à tour.
$ ls
dir1 dir2 file1 file2
$ ls -F
dir1/ dir2/ file1 file2
$ ls *
file1 file2
dir1:
…
dir2:
…
Si ls
s'est comporté différemment dans bash, soit vous avez modifié la configuration de bash pour désactiver les extensions génériques, ce qui les désactiverait partout, soit vous avez modifié la signification du ls
commande pour supprimer la liste des répertoires, probablement avec un alias. Plus précisément, avoir
alias ls='ls -d'
dans votre ~/.bashrc
aurait exactement l'effet que vous décrivez. Si c'est ce que vous avez fait, vous pouvez copier cette ligne dans ~/.zshrc
et vous aurez le même effet.
Le fait que rm -rf somepath/*
a un effet différent dans bash et zsh lorsque somepath
est un répertoire vide est une question complètement différente.
En bash, si somepath/*
ne correspond à aucun fichier, alors bash laisse le modèle générique dans la commande, donc rm
voit les arguments -rf
et somepath/*
. rm
essaie de supprimer le fichier nommé *
dans le répertoire somepath
, et comme ce fichier n'existe pas, cette tentative échoue. Puisque vous avez passé l'option -f
à rm
, il ne se plaint pas d'un fichier manquant.
Dans zsh, par défaut, si un caractère générique ne correspond à aucun fichier, zsh traite cela comme une erreur. Vous pouvez modifier le comportement de zsh en désactivant l'option nomatch
:
setopt no_nomatch
Je ne le recommande pas car le shell vous indique quand un caractère générique ne correspond pas est généralement le comportement préférable sur la ligne de commande. Il existe une bien meilleure façon de dire à zsh que dans ce cas, une liste vide est correcte :
rm -rf somepath/*(N)
N
est un qualificatif global qui dit de développer une liste vide si le caractère générique ne correspond à aucun fichier.