我有一个动态生成的复杂$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: `"'
答案 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剥离双引号)。
(经bash
和ksh
测试。)
非首选(但必要)解决方案是使用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
$