GNU/Linux >> Linux Esercitazione >  >> Linux

Differenza tra '{}' e {} nel comando find?

Per il bash shell, '{}' e {} sono intercambiabili. Questo non è il caso di tutte le shell (come fish ).

Mettere l'argomento tra virgolette singole indica esplicitamente che le parentesi graffe devono essere inviate a find . A seconda dell'uso, la shell bash a volte sostituisce il contenuto delle parentesi graffe.

Come visto di seguito, bash non sostituisce le parentesi vuote e queste vengono passate al comando. Per il find comando, non importa.

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

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

Per la maggior parte degli utenti (in particolare quelli che usano shell POSIX), non c'è differenza.

Secondo la sezione Esempio della pagina man per GNU find :

Si noti che le parentesi graffe sono racchiuse tra virgolette singole per proteggerle dall'interpretazione come punteggiatura di script di shell.

Penso che gli autori della pagina man di GNU stiano sbagliando per prudenza, ma noto che non tutti gli esempi nella loro pagina man citano le parentesi graffe. Anche questi esempi dalla documentazione ufficiale GNU find omettono le citazioni.

Negli esempi della specifica POSIX / Single UNIX le parentesi non sono tra virgolette se usato con il -exec opzione.

Con una shell POSIX, l'espansione dei parametri si verifica solo quando ci sono parametri speciali racchiusi tra parentesi graffe, ma non con parentesi graffe vuote .

La shell Bash include l'espansione delle parentesi graffe come funzionalità (non portatile), ma tali modelli vengono espansi solo quando una virgola o punti sono inclusi all'interno delle parentesi graffe . Bash utilizza anche le parentesi graffe per il raggruppamento dei comandi, ma ciò non si verifica a meno che non ci sia effettivamente esiste un gruppo di comandi all'interno della parentesi graffa.

Infine, ho provato a eseguire find -exec ls -l {} \; in sh , dash e tcsh ma nessuna di queste shell ha ampliato il {} in qualsiasi altra cosa. Come altri hanno sottolineato, il file fish shell tratta {} specialmente ma questa non è una shell POSIX (che i suoi creatori e utenti considerano un vantaggio). Non fa male citare le parentesi graffe ma i dattilografi pigri che non usano il guscio di pesce non dovrebbero sentirsi in colpa per averli omessi.


Con quasi tutti gli interpreti di shell disponibili, non c'è assolutamente alcuna differenza tra '{}' e {} .

Le virgolette singole vengono normalmente utilizzate per proteggere la stringa incorporata dall'essere sostituita da qualcos'altro, ad esempio:

  • 'a b' è un singolo parametro di tre caratteri, senza le virgolette che sarebbero due parametri di un singolo carattere
  • '$b' è letteralmente il simbolo del dollaro seguito dalla lettera b, senza le virgolette che sarebbe qualunque cosa contenga la variabile b e possibilmente nulla se non impostata
  • '!!' sono punti esclamativi letterali mentre non sono quotati e con alcune shell interattive, si espandono fino all'ultimo comando inserito nella cronologia
  • '*' è un asterisco letterale, senza virgolette verrebbe sostituito dall'elenco dei nomi di file non nascosti nella directory corrente.

Poiché né lo standard POSIX né le shell tradizionali (sh (Bourne), ksh , bash , ash , dash , zsh , csh , tcsh ) espandi {} a qualcos'altro, le virgolette non sono richieste.

Tuttavia, esiste una shell esotica, chiamata fish , che si espandono {} come una stringa vuota, ad esempio:

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

Questo è probabilmente il motivo per cui GNU find la documentazione suggerisce di proteggere {} contro l'interpretazione con virgolette o barre rovesciate.


Linux
  1. La differenza tra un comando integrato e uno che non lo è?

  2. La differenza tra [[ $a ==Z* ]] e [ $a ==Z* ]?

  3. Differenza tra Eot ed Eof?

  4. Differenza tra [0-9], [[:digit:]] e D?

  5. Differenza tra tubazioni ed espansione dei comandi?

Qual è la differenza tra Login e Non-Login Shell

Qual è la differenza tra il comando apt e apt-get?

Qual è la differenza tra individuare e trovare il comando in Linux

Linux differenza tra sudo crontab -e e solo crontab -e

Qual è la differenza tra "trova" e "trova" in Linux?

Qual è la differenza tra &> e >&in bash?