参数中的 unescape 管道

参数中的 unescape 管道

我想编写一个 bash 脚本,它接受两个参数,将它们作为命令运行并将它们的输出转储到文件中。myscript.sh内容:

$1 > file1.tmp
$2 > file2.tmp

这对于以下示例效果很好:

myscript.sh 'echo Hello World' 'echo Hello World 2'

file1.tmp现在包含文本Hello World并且file2.tmp包含文本Hello World 2

然而,当使用包含管道的命令时,这会失败:

myscript.sh 'ls | grep stuff' 'ls | grep morestuff'

ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access stuff: No such file or directory
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access morestuff: No such file or directory

看起来管道正在被转义,因为如果我运行以下命令,我会得到与第一个错误类似的输出:

ls \|

ls: cannot access |: No such file or directory

如何取消脚本中的管道转义?

答案1

您正在将一段 shell 代码传递到脚本中。对于脚本来说,这只是文本。为了将其解释为完整的 shell 命令,您必须eval执行以下操作:

eval "$1" >file1.tmp
eval "$2" >file2.tmp

$1当和$2是简单的事情时,这会起作用echo hello,因为它们是简单的命令(不是列表或复合命令)。

与另一种编程语言的类比是,如果您将一段 C 代码作为文本字符串传递到 C 程序中。代码必须先以某种方式进行编译(和链接),然后才能作为程序的一部分执行。

相关内容