Muitos se perguntam se a diferença de se usar as crases ou os parênteses para executar subcomandos é só a legibilidade da sintaxe.
A legibilidade é um dos fatores; mas não o único.
O fato é a que o segundo método, usando um cifrão ($) seguido do comando entre parêntese permite que você execute mais de um subcomando recursivamente.
"Como assim?"
Veja o exemplo. Deixo claro que é um exemplo ilustrativo. Não tem efetivamente sentido.
Como sabemos, o bash não sabe lidar com números reais; apenas inteiros. Então vamos utilizar a calculadora bc como auxiliar no cálculo com números reais:
Primeiramente definimos as operações:
Soma() # Soma de dois ou mais termos
{
echo $@ | tr ' ' '+' | bc -l
}
Sub() # Subtração de dois ou mais termos
{
echo $1-$2 | bc -l
}
Multi() # Multiplicação de dois ou mais termos
{
echo $@ | tr ' ' '*' | bc -l
}
Div() # Divisão de dois termos
{
echo $1/$2 | bc -l
}
$ X=$(Sub $(Multi $(Soma 2.5 $(Div 9 2)) 3.3) 0.5)
$ echo $X
22.60000000000000000000
Agora deixa eu explicar cada coisa que acontece acima.
Nas funções, o que é feito é o recebimento dos operandos como argumentos. No lugar dos caracteres espaço " ", colocamos o sinal referente à operação e e seguida enviamos para o bc, com o parâmetro -l, para que ele interprete números com ponto-flutuante.
Em seguida usamos as funções definidas para formarmos a sentença.
A grande sacada desta sintaxe é que os subcomandos mais internos são executados primeiro, como numa equação matemática que estamos acostumados, ou como na maioria das clássicas linguagens de programação.
"Mas isso que você fez eu posso fazer com o comando:
$ echo '((2.5+(9/2))*3.3)-0.5' | bc -l
22.60000000000000000000"
Sim, mas eu disse que era um exemplo meramente ilustrativo ;-)
Então você poderia utilizar estas funções para tarefas como calcular raízes de funções trigonométricas, dentre outras "inutilidades". rs
Agora a comparação com as conhecidas crases:
Algo como ...
X=`Sub `Multi `Soma 2.5 `Div 9 2`` 3.3` 0.5`
... não poderia ser interpretado corretamente pelo bash, simplesmente porque não há como saber onde começa e onde termina um subcomando. Para verificar isso, veja a crase após a palavra Sub. Será que ela é o "fechamento" da crase antes da palavra Sub ou inicia mais um subcomando?
Prova disso é o retorno do comando:
bash: 0.5: command not found
bash: 2.5Div: command not found
Mas isso não significa que as crases não sirvam para nada. Elas são muito úteis para quando estamos com pressa, como quando queremos entrar no diretório de módulos do kernel corrente. Tem coisa mais rápida que um "cd /lib/modules/`uname -r`/"?