我正在使用这个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
当我直接从shell调用此脚本时,没有问题,它工作正常。但是当我从另一个脚本调用这个脚本时,虽然脚本完成了它的工作,但我最后得到了这个消息:
sort: open failed: /conf/slaves: No such file or directory
sort: open failed: /conf/regionservers: No such file or directory
我在/ etc / profile中设置了$ HADOOP_HOME和$ HBASE_HOME,脚本完成了正确的工作。但我不明白为什么它最终给出了这个信息。
答案 0 :(得分:3)
你确定它做得对吗?当您从shell调用此脚本时,它将充当交互式 shell,如果存在,则会读取并/etc/profile
和~/.bash_profile
。当您从另一个脚本调用它时,它将以非交互式运行,并且不会获取这些文件。如果您希望非交互式shell来源文件,可以通过设置BASH_ENV
环境变量来完成此操作。
#!/bin/bash
export BASH_ENV=/etc/profile
./call/to/your/HADOOP/script.sh
答案 1 :(得分:1)
所有内容都指向脚本运行时定义的 not 变量。
您应该确保为脚本设置了 。在第一个循环之前,放置以下行:
echo "[${HADOOP_HOME}] [${HBASE_HOME}]"
并确保不输出"[] []"
(或甚至一个"[]"
)。
此外,在脚本顶部放置一个set +x
行 - 这将在执行行之前输出行,您可以看到正在执行的操作。
请记住,有些shell不会将环境变量传递给子shell,除非您明确导出它们(设置它们是不够的)。