2

我有一个命令需要在 shell 脚本中重复使用。该命令包含一个管道,整个命令的输出将通过管道传输到其他命令。

例如,为了简单起见,假设命令是ls | tee. 然后我可能会将它通过管道传递给其他命令,saysls | tee | someprogramls | tee | anotherprogram.

所以我自然会想保留ls | tee一个变量。问题是我似乎无法执行带有管道的变量。

#!/bin/sh
TEST="ls | tee"
$TEST

给出以下输出

ls: cannot access |: No such file or directory
ls: cannot access tee: No such file or directory

如何执行像$TEST上面这样的变量,同时能够将输出传递给其他命令?

4

1 回答 1

4

简短的回答是eval

eval $TEST somefile

eval $TEST otherfile | more

但是,您需要注意这eval意味着引用特殊字符和空格等问题。如果一切都很简单(TEST="ls -l | tee"),那么很容易。如果你在参数或 shell 元字符中有空格,那么很难——非常难以——正确地做到这一点。那时,您最好创建一个函数或单独的 shell 脚本。

即便如此,使用函数或 shell 脚本可能会更好。

如果你的字符串eval来自用户,你就更担心了!

于 2012-07-21T23:29:58.550 回答