it-swarm.it

Qual è la differenza tra $ (stuff) e `stuff`?

Esistono due sintassi per la sostituzione dei comandi: con parentesi in dollari e con backtick. Esecuzione di top -p $(pidof init) e top -p `pidof init` fornisce lo stesso output. Sono due modi di fare la stessa cosa o ci sono differenze?

270
tshepang

I backquotes vecchio stile ` ` Trattano le barre rovesciate e la nidificazione un po 'diversa. Il nuovo stile $() interpreta tutto tra ( ) Come 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 tutti POSIX - shell conformi.
Come mouviciel ha sottolineato, il vecchio stile ` ` Potrebbe essere necessario per le vecchie conchiglie.

A parte il punto di vista tecnico, il vecchio stile ` ` Ha anche uno svantaggio visivo:

  • Difficile da notare: I like $(program) better than `program`
  • Facilmente confuso con una singola citazione: '`'`''`''`'`''`'
  • Non è così facile da scrivere (forse nemmeno sul layout standard della tastiera)

(e SE usa ` ` per i propri scopi, è stato un dolore scrivere questa risposta :)

364
wag

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.

41
balki

$() non funziona con la vecchia Bourne Shell. Ma è stato anni decenni da quando ho lavorato con la vecchia Bourne Shell.

28
mouviciel

Un'altra nota, $() utilizzerà più risorse di sistema rispetto all'utilizzo di backtick, ma è leggermente più veloce.

In Mastering Unix Shell scripting , Randal K. Michael aveva fatto un test in un capitolo chiamato "24 modi per elaborare un file riga per riga".

6
cuonglm

Per aggiungere ciò che altri hanno detto qui, è possibile utilizzare i backtick per simulare commenti incorporati:

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

L'output è: foo bar.

Per ulteriori informazioni, consultare quanto segue: https://stackoverflow.com/a/12797512 (Nota anche i commenti sotto quel post.)

5
phk

La sintassi $() non funzionerà con la vecchia shell Bourne.
Con le shell più recenti ` ` E $() sono equivalenti ma $() è molto più comodo da usare quando devi annidare 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 \\\`\``
1
Emmanuel