2010-11-23 9 views
1

Ich verwende dieses Bash-Skript:Problem mit Bash-Skript

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 

Als ich das Skript von Shell direkt aufrufen, gibt es keine Probleme und es funktioniert gut. Aber wenn ich rufe das Skript von einem anderen Skript, obwohl das Skript macht seinen Job, bekomme ich diese Meldung am Ende:

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

ich gesetzt haben $ HADOOP_HOME und $ HBASE_HOME in/etc/profile und das Skript funktioniert das Job richtig. Aber ich verstehe nicht, warum es am Ende diese Nachricht gibt.

Antwort

3

Sind Sie sicher es macht es richtig? Wenn Sie dieses Skript über die Shell aufrufen, handelt es sich um eine interaktive Shell, die /etc/profile und ~/.bash_profile ausliest, wenn sie existiert. Wenn Sie es von einem anderen Skript aus aufrufen, wird es als non-interactive ausgeführt und diese Dateien werden nicht bezogen. Wenn Sie möchten, dass eine nicht interaktive Shell eine Datei bereitstellt, können Sie die Umgebungsvariable BASH_ENV festlegen.

#!/bin/bash 

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

Ich bestätigte das Problem, dies zu sein, aber BASH_ENV export immer noch nicht lösen .. –

+0

jetzt gelöst .. Ich wurde verwendet sh ./call/to/your/HADOOP/script.sh, also wurde eine neue Shell erstellt. Wenn ich es einfach als ./call/to/your/HADOOP/script.sh nenne, funktioniert es. :) –

1

Alles verweist auf diese Variablen nicht wird definiert, wenn Ihr Skript ausgeführt wird.

Sie sollten sicherstellen, dass sie für Ihr Skript festgelegt sind. Vor der ersten Schleife, legen Sie die Zeile:

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

und stellen Sie sicher, dass nicht ausgibt "[] []" (oder sogar ein "[]").

Zusätzlich eine set +x Zeile am Anfang des Skripts - dies wird Linien vor der Ausführung ausgeben und Sie können sehen, was getan wird.

Beachten Sie, dass einige Shells Umgebungsvariablen nicht an Subshells übergeben, es sei denn, Sie exportieren sie explizit (das Festlegen ist nicht ausreichend).

+0

Nein, ich habe nicht explizit ausgeführt, aber das Skript funktioniert gut einzeln und auch von anderen Skripten aufgerufen, wenn. Nur dass es diese Warnmeldung gibt, die ich nicht loswerden kann. –

+0

das half, das Problem zu debuggen .. danke! wenn es direkt aufgerufen wird, druckt es es richtig, aber wenn von einem anderen Skript zugegriffen wird, druckt es leer .. –