2010-11-23 168 views
1

我使用这个bash脚本:问题的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文件和脚本执行工作权利。但我不明白为什么它最终会传达这个信息。

回答

3

你是肯定这样做是对的吗?当您从外壳调用此脚本时,它将作为交互式外壳进行操作,该外壳会读取和提供/etc/profile~/.bash_profile(如果存在)。当你从另一个脚本调用它时,它将以非交互式运行,并且不会获取这些文件。如果你想要一个非交互式shell来源文件,你可以通过设置BASH_ENV环境变量来完成。

#!/bin/bash 

export BASH_ENV=/etc/profile 
./call/to/your/HADOOP/script.sh 
1

一切指向这些变量而不是正在您的脚本运行时定义。

你应该确保他们为你的脚本设置。第一循环之前,将行:

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

,并确保不输出"[] []"(甚至一个"[]")。

此外,在脚本的顶部放置一条set +x行 - 这将在执行它们之前输出行,并且您可以看到正在执行的操作。

请记住,除非您明确导出它们(设置它们不够),否则一些shell不会将环境变量传递给子壳体。

+0

不,我没有明确导出,但脚本单独工作,并从其他脚本调用时。只是它提供了这个我似乎无法摆脱的警告信息。 – 2010-11-23 09:32:18

+0

这有助于调试问题..谢谢!当直接调用它,它确实打印它,但从另一个脚本访问时,它打印空白.. – 2010-11-23 09:52:20