it-swarm-eu.dev

Jaký je rozdíl mezi $ (stuff) a `stuff`?

Existují dvě syntaxe pro nahrazení příkazů: s kulatými závorkami a backticky. Spuštění top -p $(pidof init) a top -p `pidof init` dává stejný výstup. Jsou tyto dva způsoby, jak dělat to samé, nebo existují rozdíly?

270
tshepang

Backquoty ve starém stylu ` ` Zpracovávají zpětná lomítka a vnořují se trochu jinak. Nový styl $() interpretuje vše mezi ( ) Jako příkaz.

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

funguje, pokud jsou vnořené zpětné uvozovky uniknuty:

echo `uname | \`echo cat\``
Linux

zpětné lomítko zábava:

echo $(echo '\\')
\\

echo `echo '\\'`
\

Nový styl $() platí pro všechny POSIX - shodné náboje.
Jak poukázal mouviciel , pro starší mušle může být nezbytný starý styl ` `.

Kromě technického hlediska má starý styl ` ` Také vizuální nevýhodu:

  • Těžko si všimnout: I like $(program) better than `program`
  • Snadno zaměňovaný s jediným citátem: '`'`''`''`'`''`'
  • Není tak snadné psát (možná ani na standardní rozložení klávesnice)

(a SE používá ` ` pro svůj vlastní účel, byla to bolest psaní této odpovědi :)

364
wag

Zjevný rozdíl vidím v tom, že nemůžete vnořit backticks, zatímco můžete vnořit $(). Možná oba existují ze starších důvodů. Podobně jsou příkazy . A source synonyma.

41
balki

$() nefunguje se starým Bourne Shell. Ale bylo to let desetiletí, co jsem pracoval se starým Bourne Shellem.

28
mouviciel

Další poznámka: $() použije více systémových prostředků než použití backticků, ale je o něco rychlejší.

V Mastering Unix Shell skriptování , Randal K. Michael provedl test v kapitole nazvané "24 způsobů zpracování souboru řádek po řádku".

6
cuonglm

Chcete-li přidat k tomu, co zde řekli ostatní, můžete pomocí backticks simulovat vložené komentáře:

echo foo `# I'm a comment!` bar

Výstup je: foo bar.

Další informace naleznete v následujícím textu: https://stackoverflow.com/a/12797512 (Všimněte si také komentářů pod tímto příspěvkem.)

5
phk

Syntaxe $() nebude fungovat se starým shellem burzy.
S novějšími skořápkami ` ` A $() jsou ekvivalentní, ale $() je mnohem pohodlnější použít, když potřebujete vnořit více příkazů.

Například :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

je snazší psát a ladit než:

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
1
Emmanuel