Pro bash
shell, '{}'
a {}
jsou zaměnitelné. To není případ všech shellů (jako je fish
).
Vložení argumentu do jednoduchých uvozovek výslovně znamená, že složené závorky by měly být odeslány na find
. V závislosti na použití bash shell někdy nahrazuje obsah složených závorek.
Jak je vidět níže, bash nenahrazuje prázdné závorky a jsou předány příkazu. Pro find
příkaz, na tom nezáleží.
$ echo {}
{}
$ echo {1}
{1}
$ echo {1,3}
1 3
$ echo '{1,3}'
{1,3}
Pro většinu uživatelů (zejména pro ty, kteří používají shelly POSIX) v tom není žádný rozdíl.
Podle části Příklad manuálové stránky pro GNU find
:
Všimněte si, že složené závorky jsou uzavřeny v jednoduchých uvozovkách, aby byly chráněny před interpretací jako interpunkcí v shellu.
Myslím, že se autoři manuálové stránky GNU mýlí na straně opatrnosti, ale podotýkám, že ne všechny příklady v jejich manuálové stránce citují složené závorky. Tyto příklady z oficiální dokumentace GNU find také vynechávají citace.
V příkladech ze specifikace POSIX / Single UNIX nejsou složené závorky uvozovány při použití s -exec
možnost.
U shellu POSIX dochází k rozšíření parametrů pouze tehdy, když jsou ve složených závorkách uzavřeny speciální parametry – ale ne s prázdnými složenými závorkami .
Skořápka Bash zahrnuje rozšíření složené závorky jako (nepřenosnou) funkci, ale takové vzory se rozbalí pouze když jsou ve složených závorkách čárka nebo tečky . Bash také používá složené závorky pro seskupování příkazů, ale k tomu nedochází, pokud neexistují skupina příkazů ve složené závorce.
Nakonec jsem zkusil spustit find -exec ls -l {} \;
v sh
, dash
a tcsh
ale žádný z těchto shellů nerozšířil {}
do čehokoli jiného. Jak poukázali jiní, fish
shell zpracovává {}
speciálně, ale nejedná se o shell POSIX (což jeho tvůrci a uživatelé považují za výhodu). Neškodí citace složených závorek ale líní písaři, kteří nepoužívají rybí krunýře, by se neměli cítit provinile, že je vynechali.
S téměř všemi dostupnými interprety shellu není mezi '{}'
absolutně žádný rozdíl a {}
.
Jednoduché uvozovky se běžně používají k ochraně vloženého řetězce před nahrazením něčím jiným, například:
'a b'
je jeden tříznakový parametr, bez uvozovek, které by byly dva jednoznakové parametry'$b'
je doslova znak dolaru následovaný písmenem b, bez uvozovek, které by byly cokoli, co proměnná b obsahuje, a možná nic, pokud by nebylo nastaveno'!!'
jsou doslovné vykřičníky, i když nejsou v uvozovkách, as některými interaktivními shelly by se rozšířily na poslední příkaz zadaný v historii'*'
je hvězdička, bez uvozovek by byla nahrazena seznamem neskrytých názvů souborů v aktuálním adresáři.
Jako ani standard POSIX, ani mainstreamové shelly (sh
(Bourne), ksh
, bash
, ash
, dash
, zsh
, csh
, tcsh
) rozbalte {}
na něco jiného, uvozovky nejsou povinné.
Existuje však exotický shell s názvem fish
, které náhodou expandují {}
jako prázdný řetězec, např.:
> ps -p %self
PID TTY TIME CMD
5247 pts/1 00:00:00 fish
> echo a {} b '{}'
a b {}
To je pravděpodobně důvod, proč GNU find
dokumentace navrhuje chránit {}
proti výkladu s uvozovkami nebo zpětnými lomítky.