Ich versuche rekursiv nach einem String zu suchen grep
, bekomme aber folgendes:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Wie kann ich verhindern, dass Bash Dateien übergibt, die mit -
als Argument beginnen?
grep
dass es sich nicht um Optionen handelt.subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])
in Python erhalten, wenn nirgendwo eine Bash stattfindet.*
in-Befehlen verursacht werden können. ALLE diese können vermieden werden, indem man./*
stattdessen verwendet.--
als End-of-Options-Siegel ist ebenfalls absolut sinnvoll. Nach den Richtlinien für die POSIX-Dienstprogrammsyntax muss diese eingehalten werden. siehe Leitlinie # 10. (Sicher, nicht alle Programme folgen den POSIX-Richtlinien, aber die Antwort ist, die Autoren der beleidigenden Programme zu reihen und / oder sie aus der Branche zu werfen.)Antworten:
Beachten Sie zunächst, dass die Interpretation von Argumenten, die mit Bindestrichen beginnen, dem Programm überlassen bleibt, das gerade gestartet wird
grep
. Die Shell hat keine direkte Möglichkeit, sie zu steuern.Angenommen, Sie möchten solche Dateien verarbeiten (und sie nicht vollständig ignorieren)
grep
, erkennt dies zusammen mit den meisten Programmen--
als Hinweis auf das Ende der Optionenwerde tun was du willst. Das
-e
gibt es für den Fall,stuff
beginnt mit einem-
ebenso.Alternativ können Sie auch Folgendes verwenden:
Letzteres würde das Problem auch vermeiden, wenn
-
im aktuellen Verzeichnis eine Datei aufgerufen würde . Wird auch nach dem--
Trennzeichen als stdingrep
interpretiert-
, während./-
die Datei-
im aktuellen Verzeichnis aufgerufen wird .quelle
Um zu verhindern, dass die Bash-Erweiterung Dateien übergibt, die mit "-" beginnen , können Sie Folgendes verwenden:
Was in den meisten Shells portabel funktioniert, oder speziell in ksh, bash, zsh:
Zum Beispiel: in einem Verzeichnis mit diesen Dateien
Wird nur auflisten (vorausgesetzt,
extglob
ist aktiv):Wenn Sie jedoch alle Dateien verarbeiten möchten, während Sie grep mitteilen, dass die mit a
-
als Optionen angegebenen Dateien nicht interpretiert werden sollen, fügen Sie einfach Folgendes hinzu./
:Oder wenn garantiert ist, dass
-
in den aufgelisteten Dateien keine genau aufgerufene Datei vorhanden ist (grep interpretiert eine einsame Datei-
als gelesen von stdin ), können Sie Folgendes verwenden:quelle
grep -r -- stuff *
ist einfacher und funktioniert auch mit Nicht-GNUish-Greps. Also: hinzugefügt, danke. @ StéphaneChazelasgrep
auf FreeBSD basiert immer noch auf GNUgrep
und hat immer noch dieses Missfeature, bei dem Optionen nach Nicht-Optionen erkannt werden. Sogar BSDs wie OpenBSD, die sie neu geschrieben haben,grep
machten sie GNU-kompatibel für die Rückwärtsportabilität (und zeigen dieses Verhalten immer noch hier). Unter macOS ist sh bash, aber ich würde erwarten, dass das grep dieses Verhalten nicht zeigt, da macOS POSIX-kompatibel sein soll, auch ohne $ POSIXLY_CORRECT. In jedem Fall wird die grep OP ist GNU-kompatibel , da es diesen Fehler gibt.echo [!-]*
als Standardäquivalent zu ksh (oderbash -O extglob
)echo !(-*)
.