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?
shell
command-line
command-substitution
tshepang
fonte
fonte
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.funciona se as aspas aninhadas forem escapadas:
barra invertida divertida:
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 :)fonte
{ }
é 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.
esource
são sinônimos.fonte
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 suportamsource
(e não.
) embora.$()
não funciona com shell Bourne antigo. Mas fazanosdécadas desde que trabalhei com a velha concha Bourne.fonte
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".
fonte
$()
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:
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.)
fonte
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 :
é mais fácil digitar e depurar do que:
fonte