GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie bekomme ich Asterisk '*' in Zsh, um das gleiche Verhalten wie Bash zu haben?

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.

Verwandte:Tastaturkürzel für ZSH-Aliase
Linux
  1. Wie erhalte ich die Bash-Vervollständigung für Befehlsaliase?

  2. Wie erhalte ich einen Variablendatentyp in Zsh?

  3. Wie lässt sich Type-Ahead auf die Bash-Verlaufssuche anwenden (Strg-R)?

  4. Wie bekomme ich das Tty, in dem Bash läuft?

  5. Wie man numerische Variablen in zsh (und vielleicht auch bash?) mit Nullen auffüllt

Wie schreibe ich eine Schleife in Bash?

So kommentieren Sie in Bash

So führen Sie ein Bash-Skript aus

Wie debuggt man ein Bash-Skript?

Wie erkennt man Bash>=4.0?

Wie kann ich eindeutige Werte aus einem Array in Bash erhalten?