管道到包含管道的字符串的命令替换

And*_*ong 5 bash pipe io-redirection command-substitution

这有效——

$ x='grep a'
$ echo ab | $x
ab
Run Code Online (Sandbox Code Playgroud)

这不——

$ x='grep a | grep b'
$ echo ab | $x
grep: |: No such file or directory
grep: grep: No such file or directory
grep: b: No such file or directory
Run Code Online (Sandbox Code Playgroud)

它出现在后一种情况下,grep a | grep b被视为单个命令, grep a \| grep b.

如何在不修改的情况下使第二个示例工作x

slm*_*slm 5

当您想要运行包含代码的变量时,您通常需要使用命令eval. 这将扩展变量的内容,以便它们可以被执行。

例子

$ x='grep a | grep b'
$  echo ab | eval "$x"
ab
Run Code Online (Sandbox Code Playgroud)

但是,通常不鼓励使用 eval,因此请谨慎使用,请参阅标题为:Eval 命令和安全问题的BashFAQ 以获取更多示例!

参考