Existem duas sintaxes para substituição de comando: com parênteses em dólar e com reticulares. Em execução top -p $(pidof init)
e top -p `pidof init`
dá a mesma saída. Existem duas maneiras de fazer a mesma coisa ou existem diferenças?
Existem duas sintaxes para substituição de comando: com parênteses em dólar e com reticulares. Em execução top -p $(pidof init)
e top -p `pidof init`
dá a mesma saída. Existem duas maneiras de fazer a mesma coisa ou existem diferenças?
Respostas:
As citações de estilo antigo ` `
tratam barras invertidas e aninhadas um pouco diferentes. O novo estilo $()
interpreta tudo no meio ( )
como um comando.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
funciona se as aspas aninhadas forem escapadas:
echo `uname | \`echo cat\``
Linux
barra invertida divertida:
echo $(echo '\\')
\\
echo `echo '\\'`
\
O novo estilo $()
se aplica a todos os shells compatíveis com POSIX .
Como mouviciel apontou, o estilo antigo ` `
pode ser necessário para as conchas mais antigas.
Além do ponto de vista técnico, o estilo antigo ` `
também tem uma desvantagem visual:
I like $(program) better than `program`
'`'`''`''`'`''`'
(e o SE usa ` `
para fins próprios, foi difícil escrever esta resposta :)
{ }
é geralmente chamado de "chaves" ou "chaves" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
é uma chave morta, então eu tenho que digitar um backtick duplo (algo que geralmente esqueço que posso fazer) ou backtick e espaço, o que é um dor.
A diferença óbvia que observo é que você não pode aninhar backticks enquanto pode aninhar $()
. Talvez ambos existam por motivos legados. Da mesma forma, os comandos .
e source
são sinônimos.
source
. Dash é um exemplo.
$(...)
e `...`
são padrão (o último sendo preterido), enquanto .
é padrão, mas nãosource
(t)csh
eles não podem ser aninhados. (t)csh
não suporte $(...)
embora. Eles suportam source
(e não .
) embora.
$()
não funciona com shell Bourne antigo. Mas faz anos décadas desde que trabalhei com a velha concha Bourne.
Outra observação: $()
usará mais recursos do sistema do que backticks, mas é um pouco mais rápido.
No domínio do script de shell do Unix , Randal K. Michael fez um teste em um capítulo chamado "24 maneiras de processar um arquivo linha por linha".
$()
torna o seu script um byte maior do que se fosse usado `
(supondo que você não os aninhe e não use barras invertidas). Quanto ao que seria mais rápido de analisar, isso variaria entre as conchas e seria irrelevante e desprezível se comparado ao custo de criação de um tubo e bifurcação do processo que implica substituição de comando.
Para adicionar ao que os outros disseram aqui, você pode usar os backticks para simular comentários embutidos:
echo foo `# I'm a comment!` bar
A saída é: foo bar
.
Consulte o seguinte para obter mais informações: https://stackoverflow.com/a/12797512 (Observe também os comentários abaixo dessa postagem.)
A $()
sintaxe não funcionará com o antigo shell bourne.
Com shells mais novos ` `
e $()
equivalentes, $()
é muito mais conveniente quando você precisa aninhar vários comandos.
Por exemplo :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
é mais fácil digitar e depurar do que:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``