GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir l'astérisque '*' dans Zsh pour avoir le même comportement que Bash ?

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.

En relation:Raccourcis clavier des alias ZSH
Linux
  1. Comment déboguer un script bash ?

  2. Comment obtenir l'achèvement de Bash pour les alias de commande ?

  3. Comment obtenir un type de données Variables dans Zsh ?

  4. Comment faire en sorte que la saisie anticipée s'applique à la recherche dans l'historique de Bash (ctrl-r) ?

  5. Comment mettre à zéro les variables numériques dans zsh (et peut-être aussi bash ?)

Comment écrire une boucle dans Bash

Comment commenter dans Bash

Comment exécuter un script bash

Comment obtenir le statut de sortie d'une boucle dans bash

Comment obtenir la date/heure de création du fichier dans Bash/Debian ?

Comment obtenir un masque de réseau à partir de bash ?