
Eu tentei os seguintes comandos
variable='one|name'
echo $variable
A saída é
one|name
enquanto echo one|name
dá um erro No command 'name' found
. Isso é razoável porque o bash trata |
como um canal e tenta executar o comando name
como one
entrada.
Mas por que echo $variable
imprimir one|name
? Após a expansão de parâmetros e variáveis, não deveria ser equivalente a echo one|name
?
Versão:
GNU bash, version 4.3.11(1)-release (i686-pc-linux-gnu)
Responder1
Não, não deveria, por causa do jeitobash
operar o comando.
Quando você digita echo one|name
, bash
analisa o comando, trata |
como um token de pipe, então |
execute o pipeline.
Quando você digita echo $variable
, porque a análise do token ocorre antes da expansão da variável, bash
a análise do comando em duas partes echo
e $variable
. Depois disso, realiza a expansão variável, expanda $variable
para one|name
. Nesse caso, one|name
é uma string, |
faz parte da string e não pode ser tratado como um token de pipe (é claro,a frase de reconhecimento de tokenfoi feito). A única coisa que pode ser especial se IFS
a variável contiver |
, bash
será usada |
como delimitador para realizar a divisão do campo:
$ variable='one|name'
$ IFS='|'
$ echo $variable
one name
Responder2
O motivo é a forma como Bash
a variável se expande.
Em vez de expandir a variável para one|name
ele expande a variável para "one|name"
. Portanto, aqui, como o valor está entre aspas, eles são tratados como string em vez de um comando.
Abaixo está a strace
saída 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
Responder3
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).