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.