$(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