Solaris: простой скрипт не работает, одна команда работает

456
CSG

В моем Solaris Illumos я запускаю простой скрипт:

 update_drv -a -i '[myhardware]' [driver] svcadm disable stmf svccfg import /mypath/myconfig svcadm enable stmf 

Это не работает и не дает мне ошибки. Служба STMF переходит в режим обслуживания, и я должен перезагрузиться!

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

Можете ли вы объяснить это поведение?

0

1 ответ на вопрос

1
Dennis Williamson

Если первая строка точно такая, как вы показали ее здесь, и вы выполняете строку из консоли в другом каталоге, чем сценарий, из которого вы запускаете сценарий, то наиболее вероятным объяснением является наличие файла в каталоге сценария. у которого есть односимвольное имя файла, которое является одним из символов в «драйвере».

Оболочка видит [driver]потенциальный глобус и пытается сопоставить его с именами файлов в каталоге. Если он находит тот, который соответствует, он заменяет имя для глобуса. Например, результирующая команда, которая выполняется, может выглядеть так:

update_drv -a -i '[myhardware]' d 

которые могут иметь непредвиденные последствия.

Чтобы предотвратить это, поместите кавычки вокруг последнего аргумента, как у предыдущего.

Тем не менее, я подозреваю, что ваши строки в скобках - просто заполнители, и вы пропустили информацию, которая может оказаться полезной при попытке найти потенциальные решения. Кстати, документация Oracle, похоже, указывает на то, что перезагрузка, скорее всего, в любом случае необходима.

Чтобы устранить неполадки в вашем сценарии, добавьте set -xв верхней части, чтобы вы могли увидеть след. Вы также можете добавить строку, например, echo "here"после первой (или любой) строки, чтобы увидеть, насколько далеко продвинется ваш скрипт. Странно, что вы не получаете никаких сообщений об ошибках.

Другая возможность - это испорченное двоичное или плохое оборудование, но это маловероятно, поскольку оно работает в командной строке.

Другое, возможно, основное соображение заключается в том, что среда отличается между сеансом консоли и сценарием. Вы не говорите, запускаете ли вы свой скрипт из командной строки или cron. В этих обстоятельствах часто бывает так, что PATHпеременная или некоторая переменная окружения установлены по-разному или не установлены. Один из способов диагностики заключается в добавлении команды, как set > script_env.outв вашем скрипте, и выполнении set > cons_env.outв командной строке diffдвух файлов и поиске существенных различий. Вы запускаете скрипт и консольную команду как разные пользователи? Это также имеет эффект.

Похожие вопросы