2010-05-03 4 views
1

J'utilise ksh et j'ai des problèmes. Pourquoi ce code ne fonctionne-t-il pas?bash/ksh/scripting eval sous-shell quotes

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

Mais cela fonctionne très bien:

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

Répondre

2

Vous devez échapper le $(...) avec un antislash pour l'empêcher d'être évalué par la coque extérieure. Le $(...) doit être conservé tel quel jusqu'à ce qu'il soit remis à la eval:

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

ksh se développe la $CMD dans le premier exemple comme un seul argument de position dont la valeur est « ls -ltr » (notez l'espace est inclus Vous voulez. il a été étendu à deux arguments: "ls" (le nom de la commande) et "-ltr" (les options) .L'exemple suivant casse cette extension car l'extension est dans le script et est ensuite transmise au sous-shell

Si vous écrivez un programme C, le premier exemple vous donne argc = 1 avec argv[0] = "ls -ltr" et la seconde vous donne argc = 2 avec argv[0] = "ls" et argv[1] = "-ltr". (Si cet exemple vous aide.)