在 shell 脚本中使用带有 $ 的 echo 命令

Ash*_*shu 1 shell echo

最近,我使用 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)

谁能解释这里发生了什么。提前致谢。

Kus*_*nda 5

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