下面的代码示例显示了问题:
bash -c "$(echo 'ls | wc -l')" # Working
"$(echo 'ls | wc -l')" # Not working
$(echo 'ls | wc -l') # Not working
'ls | wc -l' # Not working
'ls' # Working
ls | wc -l # Obviously working
我在这里缺少什么?
答案1
"ls"
如果您给 shell 一个要执行的文本字符串,如果它恰好对应于一个命令(例如("ls -l"
不是命令的名称)),它将能够执行该操作。
您的第一个示例之所以有效,是因为
echo
命令执行中的 是由调用 shell 执行的,生成bash -c "ls | wc -l"
.然后管道由 执行bash -c
,这很好。第二个、第三个和第四个示例不起作用,因为需要对生成的文本字符串进行额外的评估步骤
ls | wc -l
。eval
会为你做这件事。
"ls -l"
或"ls | wc -l"
不起作用的原因是发生了引用删除后命令行评估中的分词。
$(echo 'ls | wc -l')
不起作用的原因是命令替换也会在分词后发生。