Eu 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) nos comandos? Parece dizer que `
avalia os comandos internos e os substitui pela saída.
bash
shell
command-substitution
coolcric
fonte
fonte
Respostas:
O texto entre backticks é executado e substituído pela saída do comando (menos os caracteres de nova linha à direita e lembre-se de que o comportamento do shell varia quando há caracteres NUL na saída). Isso é chamado substituição de comando porque é substituído pela saída do comando. Portanto, se você deseja imprimir 5, não pode usar reticulares, pode usar aspas, como
echo "$b"
ou simplesmente largar qualquer cotação e usarecho $b
.Como você pode ver, como
$b
contém 5, ao usar backticksbash
está tentando executar o comando5
e, como não existe, ele falha com a mensagem de erro.Para entender como os backticks funcionam, tente executar o seguinte:
cat /etc/passwd |head -n1
deve imprimir a primeira linha do/etc/passwd
arquivo. Mas como usamos backticks, isso não é impresso no console. Em vez disso, é armazenado naA
variável Você pode ecoar$A
para isso. Observe que a maneira mais eficiente de imprimir a primeira linha está usando o comando,head -n1 /etc/passwd
mas eu queria ressaltar 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 pelo bash paraA="root:x:0:0:root:/root:/bin/bash"
.Observe que essa sintaxe é do shell Bourne. Citar e escapar torna-se rapidamente um pesadelo, especialmente quando você os aninha. O Ksh apresentou a
$(...)
alternativa que agora é padronizada ( POSIX ) e suportada por todos os shells (mesmo o shell Bourne do Unix v9). Portanto, você deve usá-lo$(...)
hoje em dia, a menos que precise ser portátil para cascas Bourne muito antigas.Observe também que a saída
`...`
e$(...)
está sujeita à divisão de palavras e geração de nome de arquivo, assim como a expansão variável (em zsh, somente divisão de palavras), portanto, geralmente, elas precisam ser citadas em contextos de lista.fonte
you can use quotation marks, like echo "$b"
=> o "" faz algo especial? Pareceecho $b
que funcionaria tão bem.echo
comando não se importa com o número de argumentos que obtém; portanto, seb
houver alguns espaços, ele receberá vários argumentos e ainda os imprimirá. Pode não ser o caso de outros comandos (especialmente quando a variável não está definida), por isso costumo sempre colocar variáveis entre aspas.(POSIX)
fosse um link para o padrão real.O backtick faz exatamente o que você diz. Você definiu uma variável para um número inteiro. Quando você coloca essa variável dentro dos backticks, o bash tenta executá-la como um comando. Como não é um comando, você recebe o erro que viu.
O que você quer fazer é simplesmente:
Para entender melhor os backticks, compare com:
fonte
Indo passo a passo sua linha deve explicar isso.
b
para 5$b
(executa efetivamente5
)echo
é o resultado da avaliação acima.Então, sim, o resultado obtido é esperado. Você está avaliando o conteúdo de uma variável, não o comando real que você pensou que era. Tudo o que você coloca nos backticks é avaliado pelo simplay (executado) em um novo (sub) shell.
fonte