bash / ksh / сценарии eval subshell quotes - PullRequest
1 голос
/ 03 мая 2010

Я использую 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 ]

2 голосов
/ 03 мая 2010

Вам нужно экранировать $(...) с обратной косой чертой, чтобы предотвратить его оценку внешней оболочкой. $(...) необходимо сохранять как есть до тех пор, пока он не будет передан eval:

$ CMD="ls -ltr"
$ eval "W=\$( $CMD )"
$ echo $W
total 197092 srwxr-xr-x 1 root root...
1 голос
/ 03 мая 2010

ksh расширяет $CMD в первом примере как отдельный позиционный аргумент, значение которого равно «ls -ltr» (обратите внимание, что пробел включен. Вы хотите, чтобы он был расширен до двух аргументов: «ls» (имя команды) и "-ltr" (параметры). В последнем примере рассматривается это расширение, поскольку расширение находится в сценарии, а затем передается в вложенную оболочку.

Если вы писали программу на C, в первом примере вы получаете argc = 1 с argv[0] = "ls -ltr", а во втором - argc = 2 с argv[0] = "ls" и argv[1] = "-ltr". (Если этот пример поможет.)

...