Qual é a diferença entre $ (stuff) e 'stuff'?

257

Existem duas sintaxes para a substituição de comandos: com parênteses em dólar e com backticks. A execução de top -p $(pidof init) e top -p 'pidof init' fornece a mesma saída. São estas duas maneiras de fazer a mesma coisa, ou existem diferenças?

    
por Tshepang 13.01.2011 / 12:02

6 respostas

345

As backquotes de estilo antigo ' ' tratam as barras invertidas e aninham-se um pouco diferentes. O novo estilo $() interpreta tudo entre ( ) 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 os backquotes aninhados forem ignorados:

echo 'uname | \'echo cat\''
Linux

diversão de barra invertida:

echo $(echo '\')
\

echo 'echo '\''
\

O novo estilo $() aplica-se a todas as conchas de POSIX .
Como mouviciel apontou, estilo antigo ' ' pode ser necessário para shells mais antigos.

Além do ponto de vista técnico, o estilo antigo ' ' também tem uma desvantagem visual:

  • Difícil de notar: I like $(program) better than 'program'
  • Facilmente confundido com uma única citação: ''''''''''''''''
  • Não é tão fácil digitar (talvez nem no layout padrão do teclado)

(e SE usa ' ' para propósitos próprios, foi uma dor escrever esta resposta:)

    
por 13.01.2011 / 12:30
40

Diferença óbvia que observo é que você não pode aninhar backticks enquanto você pode aninhar $() . Talvez ambos existam por motivos legados. Da mesma forma, os comandos . e source são sinônimos.

    
por 13.01.2011 / 12:17
27

$() não funciona com o shell Bourne antigo. Mas faz anos que eu trabalhei com o velho Bourne shell.

    
por 13.01.2011 / 15:38
5

Outra observação, $() usará mais recursos do sistema do que usar backticks, mas é um pouco mais rápida.

Em Dominando scripts de shell Unix , Randal K. Michael fez um teste em um capítulo chamado "24 maneiras processar um arquivo linha por linha ".

    
por 07.06.2013 / 21:43
3

Para adicionar ao que os outros disseram aqui, você pode usar os backticks para simular os comentários embutidos:

echo foo '# I'm a comment!' bar

A saída é: foo bar .

Veja o seguinte para obter mais informações: link (observe também os comentários abaixo desse post.)

    
por 02.12.2016 / 10:31
0

A sintaxe $() não funcionará com o shell bourne antigo.
Com shells mais novos, ' ' e $() são equivalentes, mas $() é muito mais conveniente de usar quando você precisa aninhar vários comandos.

Por exemplo:

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

é mais fácil de digitar e depurar que:

echo 'basename \'dirname \\'dirname /var/adm/sw/save \\'\''
    
por 19.02.2014 / 13:36