bash / ksh / scripting eval子shell引号

时间:2010-05-03 19:46:01

标签: bash scripting eval quotes ksh

我正在使用ksh并遇到一些麻烦。为什么这段代码没有运行?

[root]$ CMD="ls -ltr"
[root]$ eval "W=$( $CMD )"
[root]$ ksh: ls -ltr:  not found.
[root]$ echo $W 

但这很好用:

[root]$ CMD="ls -ltr"
[root]$ eval 'W=$('$CMD')'
[root]$ echo $W 

2 个答案:

答案 0 :(得分:2)

您需要使用反斜杠转义$(...)以防止外部shell对其进行评估。 $(...)需要保留原样,直到它移交给eval

$ CMD="ls -ltr"
$ eval "W=\$( $CMD )"
$ echo $W
total 197092 srwxr-xr-x 1 root root...

答案 1 :(得分:1)

ksh正在扩展第一个例子中的$CMD作为单个位置参数,其值为“ls -ltr”(注意包含空格。你希望它扩展为两个参数:“ls”(命令) name)和“-ltr”(选项)。后面的例子说明了这个扩展,因为扩展在脚本中,然后传递给子shell。

如果您正在编写C程序,则第一个示例为argc = 1提供argv[0] = "ls -ltr",第二个示例为argc = 2提供argv[0] = "ls"argv[1] = "-ltr"。 (如果那个例子有帮助的话。)