Bash - 为什么我只能通过“bash -c”使用管道执行命令字符串?

Bash - 为什么我只能通过“bash -c”使用管道执行命令字符串?

下面的代码示例显示了问题:

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 -leval会为你做这件事。

"ls -l""ls | wc -l"不起作用的原因是发生了引用删除命令行评估中的分词。

$(echo 'ls | wc -l')不起作用的原因是命令替换也会在分词后发生。

相关内容