O que é substituição de comando em um shell? [duplicado]

4
    

Esta pergunta já tem uma resposta aqui:

    

Estou usando o Ubuntu 16.04 com o Bash e tentei ler Wikipedia , em aqui e em aqui , mas não consegui entender qual é o significado de" substituição de comandos "no shell-scripting em geral, e no Bash em particular, como em:

$(command)

ou

'command'

Qual é o significado deste termo?

Edit: Quando publiquei esta questão pela primeira vez eu já conhecia o conceito puro de substituição e também o conceito Linux de substituição de variável (substituindo uma variável por seu valor por execução), mas ainda sinto falta do propósito deste recurso de shell da documentação por qualquer razão ou grupo de razões.

Minha resposta após a pergunta bloqueada

A substituição de comandos é uma única operação com sintaxe dedicada para executar um comando e ter a saída de saída (armazenada) por uma variável para uso posterior.

Um exemplo com date :

thedate=$(date)

Podemos imprimir o resultado usando o comando printf :

printf 'The date is %s\n' "$thedate"
  1. A sintaxe de substituição de comandos é $() .
  2. O comando em si é date .
  3. Combinando ambos, obtemos $(date) , que sua saída é o resultado da substituição (que poderíamos obter após execução ).
  4. Exibimos o valor de saída retido pela variável com printf , conforme o comando acima.

Nota: \n em printf é uma quebra de linha.

    
por user9303970 26.04.2018 / 01:44

2 respostas

11

"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á outro recurso da linguagem de shell que permita que você faça isso.

Uma substituição de comando, ou seja, toda a expressão $(...) , é substituída por sua saída, que é o principal uso de substituições de comandos.

O comando que a substituição do comando executa é executado em um subshell, o que significa que possui seu próprio ambiente que não afetará o ambiente do shell pai.

Nem todas as execuções subshell são substituições de comandos (veja mais exemplos no final).

Exemplo mostrando que uma substituição de comando é executada em um subshell:

$ s=123
$ echo "hello $( s=world; echo "$s" )"
hello world
$ echo "$s"
123

Aqui, a variável s é definida como a string 123 . Na próxima linha, echo é invocado em uma string contendo o resultado de uma substituição de comando. A substituição de comando define s como a string world e ecoa essa string. A string world é a saída do comando na substituição de comandos e, portanto, se isso fosse executado em set -x , veríamos que a segunda linha acima teria sido expandida para echo 'hello world' , que produz hello world no terminal:

$ set -x
$ echo "hello $( s=world; echo "$s" )"
++ s=world
++ echo world
+ echo 'hello world'
hello world

( bash adiciona um nível extra de + para todos os níveis de uma sub-rotina de substituição de comandos na saída de rastreio, outras camadas podem não fazer isso)

Por último, mostramos que o comando dentro da substituição do comando foi executado em sua própria sub-rede, porque não afetou o valor de s no shell de chamada (o valor de s ainda é 123 , não world ).

Existem outras situações em que os comandos são executados em subshells, como em

echo 'hello' | read message

Em bash , o read é executado em uma subshell, o que significa que $message não será alterado no shell pai, isto é, fazer echo "$message" após o comando acima irá ecoar uma string vazia (ou qualquer outra valor $message foi antes).

Uma substituição de processo em bash também é executada em um subnível:

cat < <( echo 'hello world' )

Isso também é diferente de uma substituição de comando.

    
por 26.04.2018 / 07:48
0
a=$(command)

armazenará o valor do resultado de command na variável.

Não há mais nada para isso.

Como uma nota secundária, acredito:

a='command'

foi preterido e tem o mesmo significado acima.

    
por 26.04.2018 / 06:17