bash/ksh/scripting eval кавычки подоболочки

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

person jhon    schedule 03.05.2010    source источник


Ответы (2)


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

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

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

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

person J. Cordasco    schedule 03.05.2010