2010-11-23 172 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