でハング:ラッパーbashスクリプトはkshのスクリプトを呼び出しますが、私はbashスクリプト</p> <p>foo.sh持っている機能
#!/bin/bash
echo "start"
. /path/to/bar/bar.ksh
echo "after bar"
getoravariables $1
はbar.ksh(目的はOracleだけ変数を設定することです):
を#!/bin/ksh
echo "b4 getora"
getoravariables() {
echo "1"
if [ $# -ne 1 ]
then
echo "2"
echo "Usage: getoravariables sid"
exit 1
fi
grep -w ${1} ${ORATAB_LOC} | grep -v "#" | sed "s/:/ /g" | read SID ORAHOME ASK
if [ $? -ne 0 ]
then
print "Error: Please enter a vaild SID and check the ${orafile} file for correct input"
return 1
fi
ps -ef|grep pmon|grep ${SID} >> /dev/null
if [ $? -ne 0 ]
then
print "Error: SID ${SID} does not seem to be started. "
return 2
fi
export ORACLE_SID=${SID}
export ORACLE_HOME="${ORAHOME}"
export ORAENV_ASK=NO
. $ORACLE_HOME/bin/oraenv > /dev/null
}
echo "after getora"
foo.shを実行した後、私は得る:
>./foo.sh validsid
start
b4 getora
after getora
したがって、 "b4 getora"と "getoraの後ろ"のechoコマンドが機能するので、単にkshスクリプトを呼び出すだけで問題はないことが分かります。しかし、私が期待するエコー "1"またはエコー "2"が得られないので、この関数を実行する際に問題があります。
さらに、foo.shをkshスクリプトとして実行すると、すべて正常に動作します。
したがって、私は、2つの言語間で文法に何らかの違いがあると推測できます。誰も助けることができますか?
UPDATE: 私は(私が私の質問に含まことがちょうどサブセットです)、私の完全なkshのスクリプトの先頭にset -x
を追加しました。
++ echo
++ grep -v '#'
++ read VAR VALUE
(hanging here)
スクリプトのこの部分のために、これらのコードは次のとおりです:
echo $GLOBPARFIL
grep -v "#" ${GLOBPARFIL}|while read VAR VALUE
do
export ${VAR}=${VALUE}
done
Soは$GLOBPARFIL
は設定されません。私は、スクリプトが機能は、私が投稿私のスクリプトで後の時点でハングことがわかりました正しく。また、それは引き込まれてgetoravariables()
から設定される変数になります。報復をデバッグからの出力はこのことを示しています。
++ read VAR VALUE
++ export GLOBPARFIL=/home/local/par/global.par
++ GLOBPARFIL=/home/local/par/global.par
このラインアップ@jlliagre答えているが、変数が正しく設定取得されていないことを宣言下回ります。しかし、私は同じ望ましくない結果だけで回避策を試しました。
UPDATE 2:私は、本当の原因を見つけ、回避策を作成することができた提供された情報とロジックに続い
:
問題:
grep -v "#" ${file_location}| tr "^" " " | while read VAR VALUE
SOLUTION:
while read VAR VALUE
do
export ${VAR}=${VALUE}
done <<%
$(grep -v "#" ${file_location}| tr "^" " ")
%
私は結婚するkを完了します。しかし、なぜこの回避策が問題を解決するのかという理由でもっと情報を得ることができたら、私はそれを高く評価します。
ありがとうございます、私の例のbar.kshスクリプトは、実際は私の大きなスクリプトのサブセットです。あなたの答えは私の本当のバーなら質問しました。kshはそれを最後までしていました。私はそれの最後にエコーを入れ、それは戻っていませんでした。問題は他の場所になければならない、私はソースを見つけるためにもっと仕事をしなければならない。 –
@ exit_1シェルスクリプトをデバッグするには、最初に 'set -x'を入力します。次に、実行するすべての行が表示されます。 – Barmar
はい、または単に 'bash -x foo.sh'を実行してください。 – jlliagre