最近,我使用了 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
a
shell在路径中(甚至在函数、别名和哈希列表之前)查找命令,但没有找到它,因此会抛出错误。
如果输出是有效命令,则它有效:
$(echo 'ls')