Estou usando o Ubuntu 16.04 com Bash e tentei ler na Wikipedia , aqui e aqui , mas não consegui entender o significado de "substituição de comando" em scripts de shell em geral e em Bash em particular, como em:
$(command)
ou
`command`
Qual é o significado deste termo?
Editar: Quando publiquei esta pergunta pela primeira vez, já conhecia o conceito puro de substituição e também o conceito Linux de substituição de variável (substituir uma variável por seu valor por execução), mas ainda perdi o objetivo desse recurso de shell da documentação para qualquer coisa razão ou grupo de razões.
Minha resposta após a pergunta bloqueada
A substituição de comandos é uma operação com sintaxe dedicada tanto para executar um comando quanto para manter a saída desse comando (armazenada) por uma variável para uso posterior.
Um exemplo com date
:
thedate="$(date)"
Podemos então imprimir o resultado usando o comando printf
:
printf 'The date is %s\n' "$thedate"
- A sintaxe de substituição do comando é
$()
. - O comando em si é
date
. - Combinando ambos obtemos
$(date)
, seu valor é o resultado da substituição (que poderíamos obter após a execução ). - Salvamos esse valor em uma variável,
$thedate
, para uso posterior. - Exibimos o valor de saída mantido pela variável com
printf
, conforme o comando acima.
Nota: \n
in printf
é uma quebra de linha.
"Substituição de comando" é o nome do recurso da linguagem shell que permite executar um comando e fazer com que a saída desse comando substitua (substitua) o texto do comando.
Não há nenhum outro recurso da linguagem shell que permita fazer isso.
Uma substituição de comando, ou seja, a
$(...)
expressão inteira, é substituída por sua saída, que é o uso principal das substituições de comando.O comando que a substituição de comando executa é executado em um subshell, o que significa que ele possui seu próprio ambiente que não afetará o ambiente do shell pai.
Nem todas as execuções de subshell são substituições de comando (veja mais exemplos no final).
Exemplo mostrando que uma substituição de comando é executada em um subshell:
Aqui, a variável
s
é definida como string123
. Na próxima linha,echo
é invocado em uma string contendo o resultado de uma substituição de comando. A substituição do comando defines
a stringworld
e ecoa essa string. A stringworld
é a saída do comando na substituição do comando e assim, se fosse executado sobset -x
, veríamos que a segunda linha acima teria sido expandida paraecho 'hello world'
, que produzhello world
no terminal:(
bash
adiciona um nível extra de+
prompts a cada nível de um subshell de substituição de comando na saída de rastreamento, outros shells podem não fazer isso)Por fim, mostramos que o comando dentro da substituição de comando foi executado em seu próprio subshell, porque não afetou o valor de
s
no shell de chamada (o valor des
ainda é123
, nãoworld
).Existem outras situações em que os comandos são executados em subshells, como em
Em
bash
, a menos que você defina alastpipe
opção (somente em instâncias não interativas), oread
é executado em um subshell, o que significa que$message
não será alterado no shell pai, ou seja, fazerecho "$message"
após o comando acima ecoará uma string vazia (ou qualquer valor$message
era antes).Uma substituição de processo
bash
também é executada em um subshell:Isso também é diferente de uma substituição de comando.
armazenará o valor do resultado
command
na variável.Não há realmente mais do que isso.
Como nota lateral, acredito:
foi descontinuado e tem o mesmo significado acima.