我正在使用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
答案 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"
。 (如果那个例子有帮助的话。)