GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl mezi '{}' a {} v příkazu find?

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.


Linux
  1. Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím?

  2. Rozdíl mezi ‚A‘ na příkazovém řádku (bash)??

  3. Rozdíl v použití mezi proměnnými shellu a proměnnými prostředí?

  1. Rozdíl mezi [0-9], [[:digit:]] a D?

  2. Rozdíl mezi potrubím a rozšířením příkazů?

  3. Rozdíl mezi Snat a Masquerade?

  1. Rozdíl mezi vestavěným příkazem a příkazem, který není?

  2. Jaký je rozdíl mezi příkazem locate a find v Linuxu

  3. Rozdíl mezi 'man ls' a 'ls --help'?