Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 字符串作为管道中的命令_Unix - Fatal编程技术网

Unix 字符串作为管道中的命令

Unix 字符串作为管道中的命令,unix,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: `"' 您可以直接使用它: cat file

我有一个复杂的动态生成的
$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: `"'

您可以直接使用它:

cat file | $CMD

您可能想要使用数组(假设KornShell或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
测试)


附加约束-无法更改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
$

@那是因为你的命令无效。您将双引号嵌套在其他双引号中。我在示例中输入的命令有效且有效。举个例子:ls-l | sed-e“s/”^^“/1/g”谢谢Jonathan。不幸的是,我无法更改命令。它是给定的。如果有办法将给定的CMD重新写入您建议的方式,那么请让我知道。@mossaab:当您有这样的约束时,请在前面的问题中这样说!这意味着你可能会得到一个符合你要求的问题答案,即使是因为你老师的强迫,或者因为你必须适应的怪异系统,答案有点古怪。谢谢@Jonathan。我已经做到了。问题是:我希望将此命令应用于管道,而不是其他管道;这还不足以表明它不能改变。事实上,你说“简化我的问题”,这表明你向我们展示的并不是你真正需要解决的问题。是的,这更清楚。但是当你遇到一个“它不能改变”的问题时,你通常可以让提供字符串的人告诉你应该如何使用它。