bash/ksh/scripting eval subshell quotes
I'm using ksh and having some trouble. Why does this code not run?
[root]$ CMD="ls -ltr"
[root]$ eval "W=$( $CMD )"
[roo开发者_高级运维t]$ ksh: ls -ltr: not found.
[root]$ echo $W
But this works fine:
[root]$ CMD="ls -ltr"
[root]$ eval 'W=$('$CMD')'
[root]$ echo $W
You need to escape the $(...)
with a backslash to prevent it from being evaluated by the outside shell. The $(...)
needs be preserved as is until it is handed off to the eval
:
$ CMD="ls -ltr"
$ eval "W=\$( $CMD )"
$ echo $W
total 197092 srwxr-xr-x 1 root root...
ksh is expanding the $CMD
in the first example as a single positional argument whose value is "ls -ltr" (note the space is included. You want it expanded to two arguments: "ls" (the command name) and "-ltr" (the options). The later example cases this expansion because the expansion is in the script and then passed to the sub-shell.
If you were writing a C program, the first example gives you argc = 1
with argv[0] = "ls -ltr"
and the second gives you argc = 2
with argv[0] = "ls"
and argv[1] = "-ltr"
. (If that example helps any.)
精彩评论