Eval для выполнения нескольких команд в ksh93, Solaris - PullRequest
0 голосов
/ 12 июля 2011

Я хотел бы выполнить две или более команд вплотную.Но эти команды хранятся в переменной в моем скрипте.Например,

var="/usr/bin/ls ; pwd ; pooladm -d; pooladm -e"

Проблема возникает, когда я выполняю эту переменную через мой скрипт.Предположим, я иду:

#!/bin/ksh -p
..
..
var="/usr/bin/ls ; pwd;pooladm -d; pooladm -e"
..
..
$var # DOES NOT WORK ..BUT WORKS WITH EVAL

Это не работает .. Но в тот момент, когда я использую eval:

eval $var

Это работает блестяще.

Мне просто интересно, есть ли какой-нибудь другой способ выполнить набор команд, хранящихся в переменной, без использования eval.

Также , eval использование считается плохой практикой программирования, потому что мои стандарты кодирования, кажется, избегают его использования, а не принимают его.Пожалуйста, дайте мне знать.

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Помните, что оболочка анализирует строку только один раз.Поэтому, когда вы расширяете ваш $ var, он становится строкой, содержащей пробелы.Поскольку у вас нет исполняемого файла с именем '/ usr / bin / ls;pwd; pooladm -d;pooladm -e ', он не может его запустить.

С другой стороны, eval принимает аргументы для их повторного сканирования, теперь вы получаете' / usr / bin / ls ',' pwd 'искоро.Это работает.

eval - это небольшая случайность, потому что она оставляет возможную дыру в безопасности - подумайте, удалось ли кому-нибудь вставить 'rm -rf /' в строку.Но это полезный инструмент.

1 голос
/ 14 июля 2011

Вы можете вызвать другую копию оболочки для запуска команды:

sh -c "$var"

Это не обязательно лучше, чем использование eval. Основное практическое отличие состоит в том, что eval будет запускать команды в контексте текущей оболочки, тогда как «sh -c» запускает команды в отдельном экземпляре оболочки. Если var содержит команды для установки переменных среды или изменения текущего каталога, вы можете или не хотите, чтобы эти команды влияли на текущую оболочку.

1 голос
/ 12 июля 2011

Используйте backticks и эхо. В вашем случае

`echo $var`
...