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?
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:
I like $(program) better than `program`
'`'`''`''`'`''`'
(a SE používá ` `
pro svůj vlastní účel, byla to bolest psaní této odpovědi :)
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.
$()
nefunguje se starým Bourne Shell. Ale bylo to let desetiletí, co jsem pracoval se starým Bourne Shellem.
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".
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.)
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 \\\`\``