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 $bcontiene 5, quando si utilizza backtick bashsi tenta di eseguire il comando 5e 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 -n1dovrebbe stampare la prima riga del /etc/passwdfile. Ma poiché usiamo i backtick, non lo stampa sulla console. Invece è memorizzato in Avariabile. Puoi fare eco $Aa questo. Si noti che il modo più efficiente di stampare la prima riga sta usando il comando head -n1 /etc/passwdma 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.