我不明白什么?
我运行它ssh-agent
并且它似乎设置了一些环境变量但是当我echo
设置它们时,我没有得到我期望的结果。
❯ ssh-agent
SSH_AUTH_SOCK=/var/folders/pn/b_2jl_j55kl504pvctj2jw2c0000gn/T//ssh-SGC2u3LSE0Gu/agent.6521; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6522; export SSH_AGENT_PID;
echo Agent pid 6522;
~
❯ echo $SSH_AGENT_PID
~
❯ echo $SSH_AUTH_SOCK
/private/tmp/com.apple.launchd.lfH6wkqh4H/Listeners
答案1
ssh-agent
是一个单独的可执行文件。它既不能设置也不能更改 shell 的变量和环境。如果没有调试器,只有 shell 本身可以执行此操作(比较这个答案)。
因此ssh-agent
生成 shell 代码来评价。您实际上看到了打印到控制台的代码,但并未对其进行评估。开始新ssh-agent
和设置变量是:
eval "$(ssh-agent)"
笔记:
手册和操作指南通常使用
eval `ssh-agent`
因为它是一种通用语法,应该适用于许多 shell,无论是
sh
-like 还是csh
-like。with 命令遵循-like shell"$(…)"
中的现代良好做法,并且您的命令在此上下文中为-like。sh
zsh
sh
ssh-agent
尝试判断您的 shell 是sh
-like 还是csh
-like,并据此生成 shell 代码。换句话说,它的行为类似于ssh-agent -s
或ssh-agent -c
,取决于它对您的 shell 的“看法”。如果您知道您的 shell 是什么,zsh
那么您可能更喜欢eval "$(ssh-agent -s)"
以防工具因某种原因猜测错误。但通常不需要这样做。几乎总是你应该避免
eval
,一般来说很难安全地使用它,有人说它“eval
是邪恶的”。ssh-agent
没关系但是,由于是ssh-agent
专门设计用于的eval
,它会生成完全受控的 shell 代码,远离使 eval 变得“邪恶”的区域和陷阱。