(6 odpovědí)
Uzavřeno před 6 lety.
Toto je část bash find
smyčky a přemýšlel jsem, která syntaxe je správnější a proč?
filename="$(echo "$i" | cut -c5-)";
filename=`echo "$i" | cut -c5-`;
Oba fungují za účelem získání názvu souboru.
Přijatá odpověď:
Manuál Bash uvádí, že:
POSIX $() forma substituce příkazů je implementována (viz Command Substitution) a upřednostňována před bourneovským shellem “ (který je také implementován pro zpětnou kompatibilitu).
Takže $(...)
má přednost před `...`
v čemkoli novém a specifickém pro Bash, co píšete¹. Substituce backtick se špatně ukládá (musíte jim uniknout) a má trochu zvláštní chování při citování. Můžete vnořit $(... $(...) ...)
libovolně hodně bez problémů. Manuál popisuje chování těchto dvou jako:
Když se použije substituce ve starém stylu zpětné uvozovky, zpětné lomítko si zachová svůj doslovný význam, kromě případů, kdy následuje ‚$‘, ‚‘‘ nebo ‚‘. První zpětná uvozovka, před kterou není zpětné lomítko, ukončuje substituci příkazu. Při použití formuláře $(command) tvoří příkaz všechny znaky v závorkách; s žádnými se nezachází speciálně.
Obvykle se považuje za osvědčený postup citovat všechna rozšíření řetězců, aby se předešlo problémům s dělením slov, a to i na místech, kde to není striktně vyžadováno, takže "$(...)"
je zde také lepší praxe.
Nakonec dvě relevantní části ze stejné vlněné stránky:
- Je také čas, abyste zapomněli na
`...`
. Není v souladu se syntaxí Expanze a je strašně těžké se usadit bez dávky léků proti bolesti. Použijte$(...)
místo toho.- A proboha:„Používejte více uvozovek!“ Chraňte své řetězce a rozšíření parametrů před dělením slov. Dělení slov sežere vaše děti, pokud nebudete věci správně citovat.
¹Vlastně i v POSIX sh
skripty, jsou považovány za nejlepší praxi. V okolí jsou stále slabší skořápky, ale budete vědět, jestli na ně narazíte.