我想编写一个 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 程序中。代码必须先以某种方式进行编译(和链接),然后才能作为程序的一部分执行。