bash脚本问题

时间:2010-11-23 09:25:20

标签: bash sorting rsync

我正在使用这个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,脚本完成了正确的工作。但我不明白为什么它最终给出了这个信息。

2 个答案:

答案 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,除非您明确导出它们(设置它们是不够的)。