Linux/Unix Scripting - самое странное поведение в нескольких строках - переменная установлена, но пуста
Я могу сказать вам, что это самая безумная вещь, которую я видел за долгое время.
У меня есть этот (часть) сценарий sh работает на CentOS 5.4:
# Check GOLD_DIR`
echo $GOLD_DIR"<--"
#export GOLD_DIR=/share/apps/GOLD_Suite/GOLD <uncommenting this line works!!
if [ "X$GOLD_DIR" = "X" ] ; then
echo "ERROR: GOLD_DIR is (probably) not set on host ${HostName}" >> ${3}
exit 1
fi
И это дает следующий вывод:
/share/apps/GOLD_Suite/GOLD<--
Waiting for 5 seconds ..... Testing output
The test script did spawn a job (i.e. PVM ran OK),
but errors were detected in the test script output
on the host machine: Below is the output
ERROR: GOLD_DIR is (probably) not set on host xxx.yyy.local
Как вы можете видеть GOLD_DIR
переменная установлена (скрипт находит ее, как показано в выводе с постфиксом)<--
")! Если я раскомментирую экспорт GOLD_DIR
Переменная в коде скрипта (первый фрагмент) все работает.
РЕДАКТИРОВАТЬ: GOLD_DIR
экспортируется в /etc/profile
(с помощью export GOLD_DIR=/share/apps/GOLD_Suite/GOLD
)
Есть идеи почему?
Примечание 1: я не знаю, важно ли это, но это скрипт spawn на PVM.
Примечание 2: сценарий написан на sh #!/bin/sh
но я использую Bash...
Edit3: я получил его работать, но я не знаю, почему! - Итак, я переименовал имя хоста (с помощью sudo hostname abc
) к названию машины, на которой я ssh (например, abc). До того, как PVM был в списке полное имя машины abc.mycompany.local
, Обратите внимание, что оба abc.mycompany.local
а также abc
это та же машина.
2 ответа
Я считаю, что это может быть связано с неинтерактивным характером работы. Задания, запускаемые из сценариев оболочки, не обязательно будут источником /etc/profile, поэтому они могут не брать вашу переменную ${GOLD_DIR}. (Если вы явно не изменили его поведение, bash будет использовать только /etc/profile для оболочки входа.)
Попробуйте добавить:
. /etc/profile
в начале вашего сценария, чтобы посмотреть, изменит ли это что-нибудь. Если нет, когда вы выводите оператор ошибки, добавьте куда-нибудь ${GOLD_DIR}, чтобы увидеть, доступна ли переменная в этом операторе.
Итак, переменная установлена. Если вы просто делаете export GOLD_DIR
вместо закомментированной строки (без установки значения) будет работать?
Также. Это единичный случай? Это что-то вроде bash на CentOS? Попробуйте использовать [[ ]], чтобы проверить, что работает неправильно.