Para el bash
concha, '{}'
y {}
son intercambiables. Este no es el caso con todos los shells (como fish
).
Poner el argumento entre comillas simples indica explícitamente que las llaves deben enviarse a find
. Según el uso, bash shell a veces sustituye el contenido de las llaves.
Como se ve a continuación, bash no sustituye los corchetes vacíos y se pasan al comando. Para el find
comando, no importa.
$ echo {}
{}
$ echo {1}
{1}
$ echo {1,3}
1 3
$ echo '{1,3}'
{1,3}
Para la mayoría de los usuarios (particularmente aquellos que usan shells POSIX), no hay diferencia.
De acuerdo con la sección Ejemplo de la página de manual de GNU find
:
Tenga en cuenta que las llaves están encerradas entre comillas simples para protegerlas de la interpretación como puntuación de script de shell.
Creo que el(los) autor(es) de la página del manual de GNU están errando por el lado de la precaución, pero observo que no todos los ejemplos en su página del manual citan las llaves. Estos ejemplos de la documentación oficial de búsqueda de GNU también omiten las citas.
En los ejemplos de POSIX / Single UNIX Specification, las llaves no se citan cuando se usa con el -exec
opción.
Con un shell POSIX, la expansión de parámetros solo ocurre cuando hay parámetros especiales encerrados entre llaves, pero no con llaves vacías .
El shell Bash incluye la expansión de llaves como una característica (no portátil), pero dichos patrones solo se expanden cuando se incluyen una coma o puntos dentro de las llaves . Bash también usa llaves para agrupar comandos, pero esto no ocurre a menos que realmente hay un grupo de comandos dentro de la llave.
Finalmente, intenté ejecutar find -exec ls -l {} \;
en sh
, dash
y tcsh
pero ninguno de estos proyectiles amplió el {}
en cualquier otra cosa. Como han señalado otros, el fish
shell trata {}
especialmente pero esto no es un shell POSIX (lo que sus creadores y usuarios consideran una ventaja). No hace daño citar las llaves pero los mecanógrafos perezosos que no usan la concha de pescado no deben sentirse culpables por omitirlos.
Con casi todos los intérpretes de shell disponibles, no hay absolutamente ninguna diferencia entre '{}'
y {}
.
Las comillas simples se usan normalmente para proteger la cadena incrustada de ser sustituida por otra cosa, por ejemplo:
'a b'
es un solo parámetro de tres caracteres, sin las comillas que serían dos parámetros de un solo carácter'$b'
es literalmente el signo de dólar seguido de la letra b, sin la comilla que sería lo que sea que contenga la variable b y posiblemente nada si no se establece'!!'
son signos de exclamación literales sin comillas y con algunas conchas interactivas, se expandirían hasta el último comando puesto en el historial'*'
es un asterisco literal, sin comillas sería reemplazado por la lista de nombres de archivo no ocultos en el directorio actual.
Como ni el estándar POSIX ni los principales shells (sh
(Bourne), ksh
, bash
, ash
, dash
, zsh
, csh
, tcsh
) expandir {}
a otra cosa, las comillas no son obligatorias.
Sin embargo, hay un caparazón exótico, llamado fish
, que se expanden {}
como una cadena vacía, por ejemplo:
> ps -p %self
PID TTY TIME CMD
5247 pts/1 00:00:00 fish
> echo a {} b '{}'
a b {}
Esa es probablemente la razón por la que GNU find
la documentación sugiere proteger {}
contra la interpretación con comillas o barras invertidas.