字符串作为管道中的命令

时间:2014-06-13 20:22:13

标签: unix

我有一个动态生成的复杂$CMD,我无法控制它的生成(因此无法更改它)。为了简化我的问题,我会假设它是这样设置的:

CMD=`echo 'sed -e "s/"^^"/1/g"'`

我想将此命令应用于管道。为了简化,我想要一些看起来像的东西:

ls -l | sed -e "s/"^^"/1/g"

我该怎么办?

以下不起作用:

ls -l | $CMD
sed: -e expression #1, char 1: unknown command: `"'

2 个答案:

答案 0 :(得分:0)

您可以直接使用它:

cat file | $CMD

答案 1 :(得分:0)

你可能想要使用一个数组(假设是Korn shell或Bash,或者可能是其他一些)。例如:

$ cmd=( 'sed' '-e' 's/^^/1/g' )
$ printf "%s\n" 'abc' '^ef' 'ghi' | "${cmd[@]}"
abc
1ef
ghi
$

数组"${cmd[@]}"中的字符串对应于您需要传递给sed的字符串。请注意,通过修改符号,您可以获得所需内容:

$ CMD=`echo 'sed -e s/^^/1/g'`
$ printf "%s\n"  'abc' '^ef' 'ghi' | $CMD
abc
1ef
ghi
$

你的部分麻烦是了解shell何时执行和不删除引号。这很难解释,但错误的产生是因为你将双引号传递给sed(通常情况下shell剥离双引号)。

(经bashksh测试。)


附加约束 - 无法更改CMD

非首选(但必要)解决方案是使用eval。一般来说,eval是危险的;不要随意使用它。

$ CMD=`echo 'sed -e "s/"^^"/1/g"'`
$ echo "$CMD"
sed -e "s/"^^"/1/g"
$ printf "%s\n" abc ^ef ghi | eval $CMD
abc
1ef
ghi
$