usando o comando echo com $ em shell script

0

Recentemente, usei o comando echo prefixando-o com $. Para minha surpresa, o que resultou foi um erro. Meu comando era algo assim.

# !/bin/bash
$(echo 'a')

O erro foi ...

./test1.sh: line 3: a: command not found

Alguém pode explicar o que está acontecendo aqui? Agradecemos antecipadamente.

    
por Ashu 12.04.2018 / 19:47

2 respostas

4

$(echo a) é uma "substituição de comando". O $(...) será substituído pela saída do comando dentro de . A saída nesse caso é a , que o shell então tenta executar. O shell não pode localizar o comando chamado a e você recebe a mensagem de erro.

Não está claro qual foi a sua intenção com isso ou o que você esperava que acontecesse. É altamente incomum querer executar o resultado de uma substituição de comando.

Alguns programas geram strings que devem ser avaliadas pelo shell. Portanto, é possível ver código como

eval "$(ssh-agent)"

que avalia (executa) a saída do comando fornecido. Esses comandos têm uma saída estritamente especificada e geralmente são considerados seguros para serem executados dessa maneira. No exemplo acima, ssh-agent iniciará o processo do agente SSH e emitirá alguns comandos que definirão as variáveis de ambiente apropriadas que o cliente ssh posteriormente precisará para usar o agente, por exemplo,

SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6018; export SSH_AGENT_PID;
echo Agent pid 6018;

Isso é avaliado por eval .

eval é usado aqui, em vez de simplesmente usar $(ssh-agent) , pois a saída do comando ssh-agent é mais um comando composto. Sem eval , os terminadores de comando ; seriam líquidos especiais.

Exemplo:

$ s='echo hello; echo world'
$ $s
hello; echo world
$ eval "$s"
hello
world
    
por 12.04.2018 / 19:48
1

Você pode usar set -x para ver o que o shell está fazendo:

set -x
$(echo 'a')
  ++ echo a
  + a

O shell executa echo a e coloca a saída na linha de comando. Isto é o mesmo que se você tivesse tentado executar esta linha de comando:

a

O shell procura por um comando a no caminho (e até mesmo antes na função, alias e listas de hash), não o encontra e, portanto, gera um erro.

Funciona se a saída for um comando válido:

$(echo 'ls')
    
por 12.04.2018 / 20:03

Tags