2013-02-27 2 views
5

In meinem Shell-Skript Ich habe folgenden Codeseltsames Verhalten von wildcharacter * in Shell-Skript

echo * | tr ' ' '\n' 

Hier bemerkte ich, dass, obwohl ich * wurde mit, es versteckte Dateien hüpft (. *) Danach habe ich versucht, eine offensichtliche Änderung

echo .* | tr ' ' '\n' 

Dies löste mein verstecktes Dateiproblem. Aber ich bin nur neugierig zu diesem seltsamen Verhalten von *

Da * ist Teilmenge von *
Die wünschenswerte Leistung von

  1. Echo. * -> Alle Dateien einschließlich der versteckten Dateien

  2. Echo . * -> Alle versteckten Dateien

  3. echo [^.] * -> Alle nicht versteckte Dateien (derzeit echo *)

Daher echo * ist wie Echo verhalten [^.] *

Wie kann ich ganze Liste von Dateien, einschließlich der versteckten Dateien mit Echo erhalten. Ähnlich war die Ausgabe für ls und dir, obwohl ls -a gab gewünschte Ausgänge

+2

'. *' Ist ** nicht die Teilmenge ** von '*'. Es ist genau ** komplementär ** (unter Annahme des POSIX-Standardverhaltens). – Jens

+0

dann was ist [^.] * ??? – Kaunteya

+0

'[^.] *' Expandiert zu den gleichen Dateinamen wie '*', also auch keine Untermenge. – Jens

Antwort

3

Dies ist in Filename Expansion

Wenn ein Muster für Dateinamen Expansion verwendet wird abgedeckt, das Zeichen ‚‘ am Anfang eines Dateinamens oder sofort einen Schrägstrich muss explizit angepasst werden, es sei denn, die Shell-Option dotglob ist eingestellt. Wenn ein Dateiname gefunden wird, muss der Schrägstrich immer explizit übereinstimmen. In anderen Fällen wird das Zeichen "." Nicht speziell behandelt.

Wenn Sie .* zusammen mit * aufnehmen möchten, müssen Sie beide Parameter geben

echo .* * | tr ' ' '\n' 

oder dotglob

shopt -s dotglob 
echo * | tr ' ' '\n' 

verwenden, um Echo, das nach wie vor, obwohl . und .. ausschließt.

6

Die Shell-Glob * ist als ignorieren versteckte Dateien definiert, so funktioniert wie erwartet. Und .* erweitert nur zu versteckten Dateien.

Einige Shells erlauben es, dieses Verhalten über eine Option zu ändern. Z.B. Die zsh ermöglicht setopt dotglob standardmäßig nicht konform (zu POSIX) und auch glob dotfiles. Für Bash können Sie shopt -s dotglob verwenden. Aber passen Sie auf, dass Skripte möglicherweise nicht richtig funktionieren, da sie normalerweise POSIX-Verhalten für globbing annehmen.

Ihre beste Wette, alle Dateien zu bekommen, ist nicht Echo zu verwenden, mit Globbing, aber zum Beispiel find . -maxdepth 1 (wenn Sie für Echo desparate sind, echo * .* werden vielleicht tun, aber es hat Probleme, wenn entweder glob, keine Datei überein in diesem Fall kann das Glob-Muster beibehalten werden).