Ich bin kürzlich von bash auf zsh umgestiegen und jetzt, wenn ich tippe
ls *
Es listet nicht einfach alle Dateien in diesem Verzeichnis auf, sondern zeigt einen Baum mit zwei Ebenen.
Auch
rm -rf somepath/*
schlägt mit der Ausgabe zsh: no matches found:
fehl
Früher hat das mit Bash gut funktioniert. Kann mir jemand helfen, dieses Verhalten zurückzubekommen?
Ich habe oh-my-zsh installiert.
Akzeptierte Antwort:
ls *
würde den gleichen Effekt in Bash haben. Was auch immer die Shell ist, was passiert ist, dass die Shell zuerst die Platzhalter erweitert und dann das Ergebnis der Erweiterung an den Befehl übergibt. Angenommen, das aktuelle Verzeichnis enthält vier Einträge:zwei Unterverzeichnisse dir1
und dir2
, und zwei reguläre Dateien file1
und file2
. Dann expandiert die Shell ls *
zu ls dir1 dir2 file1 file2
. Die ls
Der Befehl listet zuerst die Namen der Argumente auf, die existierende Nicht-Verzeichnisse sind, und listet dann der Reihe nach den Inhalt jedes Verzeichnisses auf.
$ ls
dir1 dir2 file1 file2
$ ls -F
dir1/ dir2/ file1 file2
$ ls *
file1 file2
dir1:
…
dir2:
…
Wenn ls
sich in Bash anders verhält, haben Sie entweder die Bash-Konfiguration geändert, um Wildcard-Erweiterungen zu deaktivieren, was sie überall deaktivieren würde, oder Sie haben die Bedeutung von ls
geändert Befehl, das Auflisten von Verzeichnissen zu unterdrücken, wahrscheinlich mit einem Alias. Insbesondere mit
alias ls='ls -d'
in Ihrem ~/.bashrc
hätte genau den Effekt, den du beschreibst. Wenn Sie das getan haben, können Sie diese Zeile nach ~/.zshrc
kopieren und Sie haben den gleichen Effekt.
Die Tatsache, dass rm -rf somepath/*
hat in bash und zsh einen anderen Effekt, wenn somepath
ein leeres Verzeichnis ist, ist eine ganz andere Sache.
In Bash, wenn somepath/*
mit keiner Datei übereinstimmt, lässt bash das Wildcard-Muster im Befehl, also rm
sieht die Argumente -rf
und somepath/*
. rm
versucht, die Datei namens *
zu löschen im Verzeichnis somepath
, und da es keine solche Datei gibt, schlägt dieser Versuch fehl. Da hast du die Option -f
übergeben zu rm
, es beschwert sich nicht über eine fehlende Datei.
Wenn in zsh ein Platzhalter mit keiner Datei übereinstimmt, behandelt zsh dies standardmäßig als Fehler. Sie können das Verhalten von zsh ändern, indem Sie die Option nomatch
deaktivieren :
setopt no_nomatch
Ich empfehle dies nicht, da es normalerweise das bevorzugte Verhalten auf der Befehlszeile ist, wenn die Shell Ihnen mitteilt, wenn ein Platzhalter nicht übereinstimmt. Es gibt einen viel besseren Weg, zsh mitzuteilen, dass in diesem Fall eine leere Liste in Ordnung ist:
rm -rf somepath/*(N)
N
ist ein Glob-Qualifizierer, der besagt, dass zu einer leeren Liste erweitert werden soll, wenn der Platzhalter mit keiner Datei übereinstimmt.