Unter Verwendung {html,php,htm}
kann als nur arbeitet Klammer Erweiterung , die ein Nicht - Standard (nicht POSIX-konform) Merkmal bash
, ksh
und zsh
.
Mit anderen Worten: Versuchen Sie nicht, es in einem Skript zu verwenden, das darauf abzielt. /bin/sh
Verwenden Sie in diesem Fall explizite Mehrfachargumente --include
.
grep
selbst nicht nicht verstehen {...}
Notation.
Damit eine Klammererweiterung erkannt wird, muss es sich um ein nicht zitiertes (Teil eines) Tokens in der Befehlszeile handeln.
Eine Klammer Erweiterung dehnt sich mehrere Argumente , so im Fall zur Hand grep
Enden nach oben sehen , mehrere --include=...
Optionen, wie wenn man sie einzeln vergangen war.
Die Ergebnisse einer Klammererweiterung unterliegen einem Globbing (Dateinamenerweiterung) , das Fallstricke aufweist :
Jedes resultierende Argument könnte weiter auf übereinstimmende Dateinamen erweitert werden, wenn es nicht zitierte globale Zeichen enthält, wie z *
.
Während dies bei Token wie z. B. --include=*.html
(z. B. müsste eine Datei buchstäblich so genannt werden , --include=foo.html
damit etwas übereinstimmt) unwahrscheinlich ist, sollte dies im Allgemeinen beachtet werden.
Wenn die nullglob
Shell-Option zufällig shopt -s nullglob
aktiviert ist ( ) und Globbing mit nichts übereinstimmt , wird das Argument verworfen .
Verwenden Sie daher für eine vollständig robuste Lösung Folgendes:
grep -R '--include=*.'{html,php,htm} pattern /some/path
'--include=*.'
wird als wörtlich behandelt , weil es in einfachen Anführungszeichen steht ; Dies verhindert eine versehentliche Interpretation *
als Globbing-Charakter.
{html,php,htm}
Die - notgedrungen - unquoted Verstrebung Expansion [1]
, erweitert zu 3 Argumente, die aufgrund {...}
direkt die folgenden '...'
Token , umfassen die Token.
Daher werden nach dem Entfernen des Anführungszeichens durch die Shell die folgenden 3 Literalargumente letztendlich an Folgendes übergebengrep
:
--include=*.html
--include=*.php
--include=*.htm
[1] Genauer gesagt müssen nur die syntaxrelevanten Teile der Klammererweiterung nicht in Anführungszeichen gesetzt werden. Die Listenelemente können weiterhin einzeln in Anführungszeichen gesetzt werden und müssen, wenn sie Globbing-Metazeichen enthalten, zu unerwünschtem Globbing nach der Klammererweiterung führen. Obwohl dies in diesem Fall nicht erforderlich ist, könnte das oben Gesagte als geschrieben werden
'--include=*.'{'html','php','htm'}