Expansão variável no Bash

2

Eu tentei os seguintes comandos

variable='one|name'
echo $variable

A saída é

one|name

Considerando que echo one|name apresenta um erro No command 'name' found . Isso é razoável porque o bash trata | como um canal e tenta executar o comando name com one como entrada.

Mas por que echo $variable print one|name ? Após a expansão de parâmetro e variável, não deveria ser equivalente a echo one|name ?

Versão:

GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
    
por nitishch 07.01.2015 / 14:16

3 respostas

5

Não, não deve, por causa da maneira como bash operar o comando .

Quando você digita echo one|name , bash analisa o comando, trata | como um token de pipe, portanto | executa pipeline.

Quando você digita echo $variable , porque a análise de token ocorre antes da expansão da variável, bash analisando o comando em duas partes, echo e $variable . Depois disso, ele executa a expansão de variáveis, expanda $variable para one|name . Nesse caso, one|name é uma string, | é uma parte da string e não pode ser tratado como um token de pipe (claro, a frase de reconhecimento do token foi feita). A única coisa que pode ser especial se IFS variable contiver | , bash usará | como delimitador para executar a divisão de campo:

$ variable='one|name'
$ IFS='|'
$ echo $variable
one name
    
por 07.01.2015 / 14:41
1

O motivo é por causa da maneira como Bash expande a variável.

Em vez de expandir a variável para one|name , ela expande a variável para "one|name" . Então, aqui, como o valor é colocado entre aspas, elas são tratadas como string em vez de um comando.

Abaixo está a saída strace do comando que mostra como o comando é expandido.

$ variable='one|name'
$ strace echo $variable 
execve("/bin/echo", ["echo", "one|name"], [/* 33 vars */]) = 0
brk(0)                                  = 0x9cc7000
    
por 07.01.2015 / 14:27
-2

As aspas fazem parte da string que você criou.

Se você fez

variable=one|name
echo $variable

o resultado seria o esperado. Mas você só pode fazer isso em um script (obrigado pelo comentário útil).

    
por 07.01.2015 / 14:40