I really confused to these 2 syntax. What makes they different?
Under windows VS code and git bash environment,
"$(ssh-agent -s)" works on me
$ eval "$(ssh-agent -s)"
Agent pid 966
but eval ssh-agent -s dosen't
$ eval ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-yXsZUCscU2gV/agent.960; export SSH_AUTH_SOCK;
SSH_AGENT_PID=961; export SSH_AGENT_PID;
echo Agent pid 961;
Any explanation will be helpful! Thanks
CodePudding user response:
Because ssh-agent -s prints shell commands to be executed. eval evaluates those in the context of the current shell, as if entered directly.
$(...) is called command substitution and will execute the command inside the parentheses, which are subsequently replaced with the output of the command.
So the order of steps is:
1. eval "$(ssh-agent -s)"
1.1. ssh-agent -s
(output): SSH_AUTH_SOCK=/tmp/ssh-yXsZUCscU2gV/agent.960; export SSH_AUTH_SOCK; SSH_AGENT_PID=961; export SSH_AGENT_PID; echo Agent pid 961;
2. eval "SSH_AUTH_SOCK=/tmp/ssh-yXsZUCscU2gV/agent.960; export SSH_AUTH_SOCK; SSH_AGENT_PID=961; export SSH_AGENT_PID; echo Agent pid 961;"
(output): Agent pid 961
If you didn't substitute ssh-agent -s with its output, then eval will simply evaluate/call the ssh-agent binary and show its output – without evaluating the output.
