Il testo tra i backtick viene eseguito e sostituito dall'output del comando (meno i caratteri newline finali, e attenzione che i comportamenti della shell variano quando ci sono caratteri NUL nell'output). Questo si chiama sostituzione dei comandi perché viene sostituito con l'output del comando. Quindi, se si desidera stampare 5, non è possibile utilizzare i backtick, è possibile utilizzare le virgolette, come echo "$b"
o semplicemente eliminare qualsiasi citazione e utilizzare echo $b
.
Come puoi vedere, dato che $b
contiene 5, quando si utilizza backtick bash
si tenta di eseguire il comando 5
e poiché non esiste tale comando, non riesce con un messaggio di errore.
Per capire come funzionano i backtick, prova a eseguire questo:
$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
cat /etc/passwd |head -n1
dovrebbe stampare la prima riga del /etc/passwd
file. Ma poiché usiamo i backtick, non lo stampa sulla console. Invece è memorizzato in A
variabile. Puoi fare eco $A
a questo. Si noti che il modo più efficiente di stampare la prima riga sta usando il comando head -n1 /etc/passwd
ma volevo sottolineare che l'espressione all'interno dei backtick non deve essere semplice.
Quindi, se la prima riga di / etc / passwd è root:x:0:0:root:/root:/bin/bash
, il primo comando verrà sostituito dinamicamente da bash a A="root:x:0:0:root:/root:/bin/bash"
.
Si noti che questa sintassi è della shell Bourne. Citare e scappare diventa rapidamente un incubo, specialmente quando inizi a nidificarli. Ksh ha introdotto l' $(...)
alternativa che ora è standardizzata ( POSIX ) e supportata da tutte le shell (anche la shell Bourne di Unix v9). Quindi dovresti usare $(...)
invece al giorno d'oggi a meno che tu non abbia bisogno di essere portabile su shell Bourne molto vecchie.
Si noti inoltre che l'output di `...`
e $(...)
sono soggetti alla suddivisione delle parole e alla generazione del nome del file proprio come l'espansione variabile (in zsh, solo la suddivisione delle parole), quindi generalmente dovrebbero essere citati in contesti di elenco.