GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Unterschied zwischen '{}' und {} im Find-Befehl?

Für bash Schale, '{}' und {} sind austauschbar. Dies ist nicht bei allen Shells der Fall (wie fish ).

Das Setzen des Arguments in einfache Anführungszeichen gibt ausdrücklich an, dass die geschweiften Klammern an find gesendet werden sollen . Abhängig von der Verwendung ersetzt die Bash-Shell manchmal den Inhalt von geschweiften Klammern.

Wie unten zu sehen ist, ersetzt bash keine leeren Klammern und sie werden an den Befehl übergeben. Für find Befehl, spielt keine Rolle.

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

$ echo '{1,3}'
{1,3}

Für die meisten Benutzer (insbesondere diejenigen, die POSIX-Shells verwenden) gibt es keinen Unterschied.

Gemäß dem Beispielabschnitt der Manpage für GNU find :

Beachten Sie, dass die geschweiften Klammern in einfache Anführungszeichen eingeschlossen sind, um sie vor der Interpretation als Shell-Skript-Interpunktion zu schützen.

Ich denke, der/die Autor(en) der GNU-Manpage gehen auf Nummer sicher, aber ich stelle fest, dass nicht alle Beispiele in ihrer Manpage die geschweiften Klammern zitieren. Auch diese Beispiele aus der offiziellen GNU find-Dokumentation lassen die Anführungszeichen weg.

In den Beispielen aus der POSIX / Single UNIX Specification werden die geschweiften Klammern nicht in Anführungszeichen gesetzt bei Verwendung mit -exec Option.

Bei einer POSIX-Shell erfolgt die Parametererweiterung nur, wenn spezielle Parameter in geschweiften Klammern eingeschlossen sind – aber nicht mit leeren geschweiften Klammern .

Die Bash-Shell enthält Klammererweiterung als (nicht portables) Feature, aber solche Muster werden nur erweitert, wenn ein Komma oder Punkte in die Klammern eingeschlossen sind . Bash verwendet auch geschweifte Klammern für die Gruppierung von Befehlen, aber das passiert nicht, es sei denn, es gibt tatsächlich eine eine Gruppe von Befehlen in geschweiften Klammern.

Schließlich habe ich versucht, find -exec ls -l {} \; auszuführen in sh , dash und tcsh aber keine dieser Shells erweiterte den {} in irgendetwas anderes. Wie andere bereits betont haben, ist der fish Shell behandelt {} speziell aber dies ist keine POSIX-Shell (was ihre Ersteller und Benutzer als Vorteil betrachten). Es schaden nicht, die geschweiften Klammern zu zitieren aber faule Schreibkräfte, die die Fischschale nicht verwenden, sollten sich nicht schuldig fühlen, wenn sie sie weglassen.


Bei fast allen verfügbaren Shell-Interpretern 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, zum Beispiel:

  • 'a b' ist ein einzelner dreistelliger Parameter, ohne die Anführungszeichen, die zwei einzelne Zeichenparameter wären
  • '$b' ist a buchstäblich das Dollarzeichen, gefolgt vom Buchstaben b, ohne das Anführungszeichen, das wäre, was auch immer die b-Variable enthält, und möglicherweise nichts, wenn sie nicht gesetzt ist
  • '!!' sind buchstäbliche Ausrufezeichen, wenn sie nicht in Anführungszeichen stehen und bei einigen interaktiven Shells bis zum letzten Befehl erweitert würden, der in den Verlauf eingefügt wurde
  • '*' ist ein wörtliches Sternchen, ohne Anführungszeichen würde es durch die Liste der nicht versteckten Dateinamen im aktuellen Verzeichnis ersetzt werden.

Da weder der POSIX-Standard noch die Mainstream-Shells (sh (Bourne), ksh , bash , ash , dash , zsh , csh , tcsh ) Erweitern Sie {} zu etwas anderem, die Anführungszeichen sind nicht erforderlich.

Es gibt jedoch eine exotische Shell namens fish , die zufällig {} erweitern als leerer String, z.B.:

> ps -p %self
  PID TTY          TIME CMD
 5247 pts/1    00:00:00 fish
> echo a {} b '{}'
a  b {}

Das ist wahrscheinlich der Grund, warum GNU find Dokumentation schlägt vor, {} zu schützen gegen Interpretation mit Anführungszeichen oder Backslashes.


Linux
  1. Unterschied zwischen Login-Shell und Nicht-Login-Shell?

  2. Unterschied zwischen ' und ' in der Befehlszeile (bash)??

  3. Der Unterschied in der Verwendung zwischen Shell-Variablen und Umgebungsvariablen?

  4. Unterschied zwischen Eot und Eof?

  5. Unterschied zwischen [0-9], [[:digit:]] und D?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

Unterschied zwischen Piping und Befehlserweiterung?

Unterschied zwischen Snat und Maskerade?

Unterschied zwischen Befehlen im Bash-Skript und Befehlen im Terminal