grep minus Zahl funktioniert nicht

grep minus Zahl funktioniert nicht

Ich möchte alle Dateien in einem Verzeichnis finden, das enthält -2.

Verwenden ls | grep "-2"von Retourenusage: grep...

Die Verwendung von einfachen Anführungszeichen anstelle von doppelten Anführungszeichen führt zum gleichen Ergebnis. Auch die völlige Nichtverwendung von Anführungszeichen gibt bei der Suche nach anderen Dingen korrekte übereinstimmende Dateinamen zurück.

Soweit ich mich erinnere, -ist das kein Regex-Sonderzeichen.

Bitte konzentrieren Sie sich nicht auf das spezielle Problem, Dateien mit einem Namen zu finden. Ich möchte in erster Linie verstehen, warum sich grep so verhält.

Verwenden von bash unter macOS 10.13

Antwort1

Es ist, als würde -2 als Befehlszeilenparameter interpretiert, unabhängig von der Tatsache, dass es in Anführungszeichen steht.

grep weiß nichtob ein Parameter in Anführungszeichen steht oder nicht.

Viele Analyseschritte werden von der Shell selbst ausgeführt, 1 bevor überhaupt etwas ausgeführt wird – >Umleitungen werden angewendet, $Variablen erweitert, *Platzhalter werden erweitert, |Pipelines in eine Reihe einzelner Befehle aufgeteilt und jeder Befehl in ein Array von Wörtern aufgeteilt.

Egal, ob Sie grep -2, grep '-2', grep \-2, oder sogar ausführen x=-2; grep $x, die Shell sieht es immer noch als dieselbe Parameterliste: { grep, -2}. Dies wird an den Systemaufruf execv() übergeben, und das ist es, was dergrepDas Programm erhält es in seinem argv[]Array, unabhängig von der ursprünglichen Zitierung.


1 Selbst unter Windows, wo die Befehlszeile in CreateProcess() nur eine einzelne Zeichenfolge ist,grepwird dieses Verhalten immer noch aufweisen, da die C-Laufzeitbibliothek während der Initialisierung dieselbe Argumentaufteilung durchführt.

verwandte Informationen