我想echo
用|
(管道)替换命令。例如,
$(echo "echo 'hello' | cat")
回报
'hello' | cat
我希望这会表现得像
echo 'hello' | cat
返回
hello
但事实并非如此。为什么?
附言。我知道eval
,并且
eval $(echo "echo 'hello' | cat")
按预期工作
答案1
|
因为像(or &&
, or等)这样的语法元素;
被识别为命令行解析的第一件事,并且在参数/变量扩展后不会再次处理。
在参数扩展、命令替换和算术扩展之后发生的几乎唯一的事情就是分词和文件名通配。扩展的输出也不会再次扩展:这不会打印6
:
$ var='$((1+2+3))' # $((..)) not expanded here (single-quotes)
$ echo $var # $((..)) not expanded here either
$((1+2+3))
再次进行解析和扩展正是我们的eval
目的。
有关的: