Проблема со скриптом bash - PullRequest
1 голос
/ 23 ноября 2010

Я использую этот скрипт bash:

for a in `sort -u $HADOOP_HOME/conf/slaves`; do
        rsync -e ssh -a "${HADOOP_HOME}/conf" ${a}:"${HADOOP_HOME}"
done
for a in `sort -u $HBASE_HOME/conf/regionservers`; do
        rsync -e ssh -a "${HBASE_HOME}/conf" ${a}:"${HBASE_HOME}"
done

Когда я вызываю этот скрипт прямо из оболочки, проблем нет, и он работает нормально. Но когда я вызываю этот скрипт из другого скрипта, хотя скрипт выполняет свою работу, я получаю это сообщение в конце:

sort: open failed: /conf/slaves: No such file or directory
sort: open failed: /conf/regionservers: No such file or directory

Я установил $ HADOOP_HOME и $ HBASE_HOME в / etc / profile, и скрипт выполняет свою работу правильно. Но я не понимаю, почему он дает это сообщение в конце.

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Вы уверены, все делает правильно? Когда вы вызываете этот скрипт из оболочки, он действует как интерактивная оболочка, которая читает и получает /etc/profile и ~/.bash_profile, если он существует. Когда вы вызываете его из другого скрипта, он запускается как неинтерактивный и не получает эти файлы. Если вы хотите, чтобы неинтерактивная оболочка создавала файл, вы можете сделать это, установив переменную окружения BASH_ENV.

#!/bin/bash

export BASH_ENV=/etc/profile
./call/to/your/HADOOP/script.sh
1 голос
/ 23 ноября 2010

Все указывает на то, что эти переменные не были определены при запуске вашего скрипта.

Вы должны убедиться, что они установлены для вашего скрипта.Перед первым циклом поместите строку:

echo "[${HADOOP_HOME}] [${HBASE_HOME}]"

и убедитесь, что она не выдает "[] []" (или даже один "[]").

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

Имейте в виду, что некоторые оболочки не передают переменные среды в подоболочки, если вы явно не экспортируете их(их недостаточно).

...