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

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

最近,我使用了 echo 命令,并在其前面加上了 $ 前缀。令我惊讶的是,结果是一个错误。我的命令是这样的。

# !/bin/bash
$(echo 'a')

错误是..

./test1.sh: line 3: a: command not found

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

答案1

$(echo a)是“命令替换”。将$(...)被替换为内命令的输出。本例中的输出是a,然后 shell 尝试执行该输出。 shell 无法找到调用的命令a,并且您会收到错误消息。

目前尚不清楚您这样做的意图是什么或您期望发生什么。这是极不寻常想要执行命令替换的结果。


某些程序输出应由 shell 计算的字符串。因此可以看到类似的代码

eval "$(ssh-agent)"

它评估(运行)给定命令的输出。这些命令具有严格指定的输出,通常认为以这种方式运行是安全的。在上面的示例中,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;

然后通过 进行评估eval

eval此处使用而不是简单地使用,$(ssh-agent)因为命令的输出ssh-agent更多的是复合命令。如果没有eval;命令终止符将变得特殊。

例子:

$ s='echo hello; echo world'
$ $s
hello; echo world
$ eval "$s"
hello
world

答案2

您可以使用以下命令set -x查看 shell 正在做什么:

set -x
$(echo 'a')
  ++ echo a
  + a

shell 执行echo a并将输出放在命令行上。这与您尝试执行此命令行的效果相同:

a

ashell在路径中(甚至在函数、别名和哈希列表之前)查找命令,但没有找到它,因此会抛出错误。

如果输出是有效命令,则它有效:

$(echo 'ls')

相关内容