Использование имени пользователя, начинающегося с символа «##» в приглашении bash

Проблема была диагностирована в комментариях к вопросу. В своем ответе я объясню, что происходит и как это исправить.

Код

if [ -n ${OSSIEHOME} ] && [ -d ${OSSIEHOME}/share/aclocal/ossie ]; тогда

опасно, потому что вы используете раскрытие переменных без кавычек. "${OSSIEHOME}"или просто "$OSSIEHOME"расширяется до значения переменной, но ${OSSIEHOME}вне кавычек разбивается на слова. В частности, если переменная пуста или не установлена, то команда слева от оператора &&расширяется до [-n], что верно . Вы можете видеть в трассировке, созданной bash -x, что выполняется [-n]. Подробнее см. Почему мой сценарий оболочки забивается пробелами или другими специальными символами?. С этого момента не забывайте всегда заключать в двойные кавычки замену переменных и команд¹.

if [ -n "${OSSIEHOME}" ] && [ -d "${OSSIEHOME}/share/aclocal/ossie" ]; then
  …

Это исправит некорректную отчетность об ошибках. Но вам все равно нужно убедиться, что переменная установлена ​​при запуске скрипта. Недостаточно проверить, что echo $OSSIEHOMEпечатает что-то в вашей текущей оболочке. Вы должны убедиться, что переменная находится в среде. Если вы запускаете только OSSIEHOME=/usr/local/redhawk/core, это устанавливает только переменную оболочки. Чтобы установить переменную среды, вам нужно запустить export OSSIEHOME=/usr/local/redhawk/core(или OSSIEHOME=/usr/local/redhawk/core, а затем экспорт OSSIEHOME).

Вы добавляете, что вызываете скрипт через sudo.В типичных конфигурациях sudo удаляет большинство переменных из среды. (Это жизненно важно для безопасности, когда пользователям разрешено запускать только определенные команды, но это раздражает без каких-либо серьезных преимуществ с точки зрения безопасности, если вам разрешено запускать произвольные команды с помощью sudo.) Поэтому вам нужно явно указать sudo установить эту переменную, когда вы запускаете скрипт.

sudo OSSIEHOME=/usr/local/redhawk/core /path/to/your/script

Если переменная уже установлена ​​в среде оболочки и вы не хотите повторять значение, вы можете использовать

sudo OSSIEHOME="$OSSIEHOME" /path/to/your/script

В качестве альтернативы вам может быть разрешено или не разрешено запускать sudo -E /path/ в/ваш/скрипт. Параметр -Eуказывает sudo сохранить большинство переменных среды.

Выполняется источникили . с sudo не работает, потому что это встроенные функции оболочки, а не исполняемые команды. Они встроены в оболочку из-за того, что они делают: запускают скрипт в той же оболочке, которая уже запущена, т. е. это инструкция в оболочке идти и читать команды из файла, а не инструкция по выполнению отдельной программа. Это не имеет никакого смысла с sudo: если бы сценарий выполнялся в том же процессе оболочки, он выполнялся бы с теми же привилегиями.

¹ Для опытных пользователей добавьте «если вы не знаете, почему вам нужно их опустить».

0
09.06.2016, 00:09
0 ответов

Теги

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