In der Dokumentation sehe ich die Verwendung in beide Richtungen:
find . -type f -exec file '{}' \;
find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \
In der Dokumentation sehe ich die Verwendung in beide Richtungen:
find . -type f -exec file '{}' \;
find repo/ -exec test -d {}/.svn -o -d {}/.git -o -d {}/CVS ; \
Antworten:
Für die
bash
Schale'{}'
und{}
sind austauschbar. Dies ist nicht bei allen Shells (wie z. B.fish
) der Fall .Wenn Sie das Argument in einfache Anführungszeichen setzen, wird explizit angegeben, dass die geschweiften Klammern an gesendet werden sollen
find
. Abhängig von der Verwendung ersetzt die Bash-Shell manchmal den Inhalt von geschweiften Klammern.Wie weiter unten zu sehen ist, ersetzt bash keine leeren Klammern und sie werden an den Befehl übergeben. Für den
find
Befehl spielt es keine Rolle.quelle
" are interchangeable"
durch" are interchangeable in some shells, not in all of them. ALWAYS use the single quotes to make sure they get passed as-is to the find command"
(gute Gewohnheiten beginnen, indem Sie sicherstellen, dass Sie den richtigen Weg verwenden, auch wenn Sie sich (immer?) Auf einem System befinden, das das Mehrdeutige zulässt)Bei fast allen verfügbaren Shell-Interpreten gibt es absolut keinen Unterschied zwischen
'{}'
und{}
.Die einfachen Anführungszeichen werden normalerweise verwendet, um die eingebettete Zeichenfolge davor zu schützen, durch etwas anderes ersetzt zu werden. Beispiel:
'a b'
ist ein einzelner Parameter mit drei Zeichen, ohne die Anführungszeichen, die zwei einzelne Zeichenparameter wären'$b'
a ist buchstäblich das Dollarzeichen, gefolgt vom Buchstaben b, ohne das Anführungszeichen, das in der Variablen b enthalten ist und möglicherweise nichts, wenn es nicht gesetzt ist'!!'
Wenn sie nicht in Anführungszeichen gesetzt sind und einige interaktive Shells enthalten, werden sie bis zum letzten Befehl im Verlauf erweitert'*'
Ist ein Wurfstern, wird er ohne Anführungszeichen durch die Liste der nicht ausgeblendeten Dateinamen im aktuellen Verzeichnis ersetzt.Da weder der POSIX - Standard noch den Mainstream - Schalen (
sh
(Bourne)ksh
,bash
,ash
,dash
,zsh
,csh
,tcsh
) zu erweitern ,{}
um etwas anderes, sind die Anführungszeichen nicht erforderlich.Es gibt jedoch eine exotische Shell mit dem Namen
fish
, die sich zufällig{}
als leere Zeichenfolge ausdehnt , z.Dies ist wahrscheinlich der Grund, warum die GNU-
find
Dokumentation{}
vor Interpretationen mit Anführungszeichen oder Backslashes schützt .quelle
Für die meisten Benutzer (insbesondere für Benutzer von POSIX-Shells) besteht kein Unterschied.
Entsprechend dem Beispielabschnitt der Manpage für GNU
find
:Ich denke, die Autoren der GNU-Manpage irren sich vorsichtshalber, aber ich stelle fest, dass nicht alle Beispiele in ihrer Manpage die geschweiften Klammern zitieren. Diese Beispiele aus der offiziellen GNU-Find-Dokumentation lassen das Zitieren ebenfalls aus.
In den Beispielen aus der POSIX / Single UNIX-Spezifikation werden die Klammern bei Verwendung der Option nicht in Anführungszeichen gesetzt
-exec
.Bei einer POSIX-Shell erfolgt die Parametererweiterung nur, wenn spezielle Parameter in geschweiften Klammern eingeschlossen sind - nicht jedoch bei leeren Klammern .
Die Bash-Shell enthält die Erweiterung von geschweiften Klammern als (nicht tragbares) Feature. Solche Muster werden jedoch nur dann erweitert, wenn ein Komma oder Punkte in den geschweiften Klammern enthalten sind . Bash verwendet auch Klammern für Befehl Gruppierung , aber dies nicht der Fall , es sei denn tatsächlich ist eine Gruppe von Befehlen innerhalb der Klammer.
Schließlich habe ich versucht , laufen
find -exec ls -l {} \;
insh
,dash
undtcsh
doch keines dieser Schalen der expandierte{}
in irgendetwas anderes. Wie bereits erwähnt, wird diefish
Shell{}
speziell behandelt , es handelt sich jedoch nicht um eine POSIX-Shell (die von ihren Erstellern und Benutzern als Vorteil angesehen wird). Es schadet nicht, die Klammern zu zitieren, aber faule Schreibkräfte, die die Fischschale nicht benutzen, sollten sich nicht schuldig fühlen, wenn sie sie weglassen.quelle
'{}'
stattdessen verwenden{}
), so dass ihre Shell{}
an den find-Befehl sendet , ohne ihn zu interpretieren (wie oben von @ Charles-Duffy erwähnt, falls Sie zufällig Fische verwenden) , es wird interpretieren,{}
aber nicht'{}'
, so dass Sie letzteres auf dieser Shell (und auf mehreren anderen!) verwenden müssen. Verwenden Sie daher immer, um'{}'
zu vermeiden, von der Zweideutigkeit von{}
Dies hängt von der Syntax Ihrer Shell ab. Wenn Sie Zweifel haben, wiederholen Sie es!
Führen Sie das aus
und das.
Wenn sie die gleiche Ausgabe erzeugen, lautet die Antwort für Ihre Shell "Ja". Wie andere angemerkt haben, wird es zumindest Ja in Bash und Nein in Fisch sein. Für die Ausgabe sollten Sie die Manpage eines bestimmten Befehls konsultieren.
Wenn Sie sich als nützlich erweisen möchten, können Sie sogar
echo
eine ganze Befehlszeile voranstellen , um den tatsächlichen Befehl mit all seinen Argumenten anzuzeigen, den Ihre Shell tatsächlich aufrufen würde. Beachten Sie jedoch, dass die Liste, die den Befehl und die Argumente enthält, ein echtes Array von Zeichenfolgen ist, von denen jede möglicherweise leer oder mit Leerzeichen versehen ist. Echo gibt sie jedoch mehrdeutig als durch Leerzeichen getrennte Liste aus.Wie mit diesem etwas ausführlicheren Echo-Befehl (der Argumente in Anführungszeichen zeigt) überprüft werden kann,
Geben Sie dies in die Befehlszeile ein,
bedeutet dies zu schlagen:
und das bei fisch:
Generell kann es nie schaden, etwas zu zitieren.
quelle