Compreendendo o backtick (')

32

Estou tentando o comando

$ b=5; echo '$b';
-bash: 5: command not found

mas não imprime 5 como deveria. O que estou perdendo aqui?

O que significa '(backquote / backtick) em comandos? parece dizer que ' avalia os comandos dentro e os substitui pela saída.

    
por coolcric 17.09.2012 / 12:57

3 respostas

46

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>     

por 17.09.2012 / 13:01
10

O backtick faz exatamente o que você diz. Você definiu uma variável para um inteiro. Quando você coloca essa variável dentro dos backticks, o bash tentará executá-la como um comando. Como não é um comando, você recebe o erro que viu.

O que você quer fazer é simplesmente:

$ b=5; echo $b

Para entender melhor os backticks, compare com:

$ b=5; a='echo $b'; echo $a
  5
    
por 17.09.2012 / 13:04
7

Indo passo a passo, sua linha deve explicá-lo.

$ b=5; echo '$b';
  1. define a variável b para 5
  2. avalia $b (efetivamente executa 5 )
  3. echo es da saída da avaliação acima.

Então, sim, a saída que você obteve é esperada. Você está avaliando o conteúdo de uma variável, não o comando real que você pensou que fosse. Tudo o que você coloca dentro de backticks é avaliado em simplay (runned) em um novo (sub) shell.

    
por 17.09.2012 / 13:02