最近,我使用 echo 命令在它前面加上 $ 前缀。令我惊讶的是,结果是一个错误。我的命令是这样的。
# !/bin/bash
$(echo 'a')
Run Code Online (Sandbox Code Playgroud)
错误是..
./test1.sh: line 3: a: command not found
Run Code Online (Sandbox Code Playgroud)
谁能解释这里发生了什么。提前致谢。
$(echo a)
是“命令替换”。的$(...)
将被替换中的命令的输出。在这种情况下的输出是a
,然后 shell 尝试执行它。shell 找不到调用的命令a
,您会收到错误消息。
目前尚不清楚您对此的意图是什么或您预期会发生什么。想要执行命令替换的结果是非常不寻常的。
一些程序输出应该由 shell 评估的字符串。因此可以看到类似的代码
eval "$(ssh-agent)"
Run Code Online (Sandbox Code Playgroud)
它评估(运行)给定命令的输出。这些命令具有严格指定的输出,并且通常被认为以这种方式运行是安全的。在上面的示例中,ssh-agent
将启动 SSH 代理进程并输出一些命令,这些命令将设置ssh
客户端稍后使用代理所需的适当环境变量,例如,
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6018; export SSH_AGENT_PID;
echo Agent pid 6018;
Run Code Online (Sandbox Code Playgroud)
然后由 评估eval
。
eval
在这里使用而不是简单地使用,$(ssh-agent)
因为ssh-agent
命令的输出更像是一个复合命令。如果没有eval
,;
命令终止符将会很特别。
例子:
$ s='echo hello; echo world'
$ $s
hello; echo world
$ eval "$s"
hello
world
Run Code Online (Sandbox Code Playgroud)