Esistono due sintassi per la sostituzione dei comandi: con parentesi in dollari e con backtick. In esecuzione top -p $(pidof init)
e top -p `pidof init`
dà lo stesso output. Sono due modi di fare la stessa cosa o ci sono differenze?
Esistono due sintassi per la sostituzione dei comandi: con parentesi in dollari e con backtick. In esecuzione top -p $(pidof init)
e top -p `pidof init`
dà lo stesso output. Sono due modi di fare la stessa cosa o ci sono differenze?
Risposte:
I backquotes vecchio stile ` `
trattano le barre rovesciate e la nidificazione un po 'diversa. Il nuovo stile $()
interpreta tutto nel mezzo ( )
come un comando.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
funziona se i backquotes nidificati sono sottoposti a escape:
echo `uname | \`echo cat\``
Linux
backslash fun:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Il nuovo stile si $()
applica a tutte le shell conformi a POSIX .
Come mouviciel ha sottolineato, il vecchio stile ` `
potrebbe essere necessario per le conchiglie più vecchie.
A parte il punto di vista tecnico, il vecchio stile ` `
ha anche uno svantaggio visivo:
I like $(program) better than `program`
'`'`''`''`'`''`'
(e SE usa ` `
per il proprio scopo, è stato un dolore scrivere questa risposta :)
{ }
solito viene chiamato "parentesi graffe" o "parentesi graffe" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
è un tasto morto, quindi devo digitare un doppio backtick (qualcosa che di solito dimentico che posso persino fare) o backtick quindi lo spazio, che è un dolore.
La differenza evidente che osservo è che non puoi nidificare i backtick mentre puoi nidificare $()
. Forse entrambi esistono per motivi legati al passato. Allo stesso modo, i comandi .
e source
sono sinonimi.
source
. Dash è un esempio.
$(...)
e `...`
sono standard (quest'ultimo è deprecato) mentre .
è standard ma nonsource
(t)csh
non possono essere nidificati. (t)csh
non supportare $(...)
però. Tuttavia supportano source
(e non .
).
$()
non funziona con la vecchia shell Bourne. Ma è stato anni decenni da quando ho lavorato con il vecchio Bourne shell.
Un'altra nota, $()
utilizzerà più risorse di sistema rispetto all'uso dei backtick, ma è leggermente più veloce.
Nel mastering dello scripting della shell Unix , Randal K. Michael aveva fatto un test in un capitolo chiamato "24 modi per elaborare un file riga per riga".
$()
rende il tuo script un byte più grande di se usato `
(supponendo che non li annidi e non usi le barre rovesciate). Quanto a ciò sarebbe più veloce da analizzare, ciò varierebbe tra shell e sarebbe irrilevante in quanto trascurabile rispetto al costo di creazione di una pipe e di un fork di processo che comporta la sostituzione del comando.
Per aggiungere ciò che altri hanno detto qui, è possibile utilizzare i backtick per simulare commenti incorporati:
echo foo `# I'm a comment!` bar
L'uscita è: foo bar
.
Vedere di seguito per ulteriori informazioni: https://stackoverflow.com/a/12797512 (notare anche i commenti sotto quel post.)
La $()
sintassi non funzionerà con la vecchia shell Bourne.
Con le nuove shell ` `
e $()
sono equivalenti, ma $()
è molto più comodo da usare quando è necessario nidificare più comandi.
Per esempio :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
è più facile da digitare ed eseguire il debug di:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``