O texto entre os backticks é executado e substituído pela saída do comando (menos os caracteres de nova linha à direita, e tenha cuidado com o comportamento dos shell quando há caracteres NUL na saída). Isso é chamado de substituição de comando porque é substituído pela saída do comando. Então, se você quiser imprimir 5, você não pode usar backticks, você pode usar aspas, como echo "$b" ou simplesmente soltar qualquer cotação e usar echo $b .
Como você pode ver, como $b contém 5, ao usar backticks bash está tentando executar o comando 5 e, como não há tal comando, ele falha com a mensagem de erro.
Para entender como os backticks funcionam, tente executar isso:
$ A='cat /etc/passwd | head -n1'
$ echo "$A"
cat /etc/passwd |head -n1 deve imprimir a primeira linha do arquivo /etc/passwd . Mas como usamos backticks, isso não é impresso no console. Em vez disso, ele é armazenado na variável A . Você pode echo $A para isso. Note que a maneira mais eficiente de imprimir a primeira linha é usar o comando head -n1 /etc/passwd , mas eu queria salientar que a expressão dentro dos backticks não precisa ser simples.
Portanto, se a primeira linha de / etc / passwd for root:x:0:0:root:/root:/bin/bash , o primeiro comando será substituído dinamicamente por bash para A="root:x:0:0:root:/root:/bin/bash" .
Observe que essa sintaxe é do shell Bourne. Citar e fugir torna-se rapidamente um pesadelo, especialmente quando você começa a aninhá-los. O Ksh apresentou a alternativa $(...) , que agora é padronizada ( POSIX ) e é apoiada por todos shells (até mesmo o shell Bourne do Unix v9). Portanto, você deve usar $(...) em vez de ser necessário portá-lo para cascas Bourne muito antigas.
Observe também que a saída de '...' e $(...) está sujeita à divisão de palavras e geração de nome de arquivo, assim como expansão de variável (em zsh, somente divisão de palavras), geralmente precisaria ser citada em contextos de lista. p>