Diferença / Anomalia de Substituição de Comando do Shell

2

Ao criar scripts no Bash, aprendemos a atribuir uma variável à saída de um comando, podemos usar a construção:

variable=$(command-string)

Isso é conhecido como substituição de comando e executa o conteúdo da string de comando em um ambiente de sub-shell.

Eu posso ter descoberto uma anomalia.

Ao executar esta forma de substituição de comando, SEM atribuição de variável, os resultados diferem.

Exemplo:

cmd=date
var=$(echo $cmd)
echo $var
$(echo $cmd)

Saída:

date
Fri Jun 29 15:11:58 EDT 2018

A substituição de comando sem atribuição de variável parece estar tentando uma avaliação de stdout de execução de comando, enquanto a atribuição de variável não.

    
por Jon Kreisler 29.06.2018 / 21:22

2 respostas

5

Sua substituição de comando é avaliada como: date

Como você não está atribuindo nada, o que você está fazendo é basicamente digitar date no prompt de comando.

$ set -x
$ cmd=date
+ cmd=date
$ var=$(echo $cmd)
++ echo date
+ var=date
$ echo $var
+ echo date
date
$ $(echo $cmd)
++ echo date
+ date
Fri Jun 29 13:26:55 MDT 2018

Como date é um comando válido, ele é executado conforme o esperado.

    
por 29.06.2018 / 21:25
0

Acredito ter uma explicação técnica razoavelmente concisa. Estamos lidando com um CLI (Interpretador de linha de comando) e os resultados da substituição de comando dependem da fase de interpretação quando o analisador encontra o token de substituição "$ (".

cmd="date"

Atribuição simples; variável "cmd" tem a string "data".

var=$(echo $cmd)
$(echo $cmd)

No primeiro caso, o analisador (que lê da esquerda para a direita) encontrou um token "=" para saber que está esperando uma sequência de equivalência para uma atribuição de variável. No segundo caso, o analisador não determinou o tipo de comando com o qual estava lidando, quando atingiu "$ (". Em ambos os casos, a análise é pausada e um ambiente de subshell é criado. A cadeia entre os parênteses é interpretada pela CLI e o conteúdo da stdout é usado para substituir "$ (", o parêntese à direita correspondente, sem aspas e tudo entre. Agora, a CLI retoma de onde parou. Neste exemplo, em Em ambas as instâncias, o stdout contém a string "date" .Na primeira instância, o CLI estava esperando uma string de equivalência, então interpreta "var = date" como atribuindo a string "date" à variável "var". Na segunda instância, a CLI interpreta "data". Como date é um programa válido no caminho atual, esse programa é chamado. Então, nada está realmente errado, é apenas a maneira como o intérprete realiza a substituição.

    
por 03.07.2018 / 18:05