我有一个bash脚本包装bash脚本调用KSH脚本,但挂在功能
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脚本,一切正常。
因此,我可以假设这两种语言之间的语法存在某种差异,但我并不感兴趣。任何人都可以协助
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
所以$GLOBPARFIL
不被设置正常。它也恰好是一个变量,从getoravariables()
被拉入和设置。从调试达输出说明了这一点:
++ read VAR VALUE
++ export GLOBPARFIL=/home/local/par/global.par
++ GLOBPARFIL=/home/local/par/global.par
这行了@jlliagre回答以下声明的变量没有得到正确设置。不过,我尝试了解决方法只有相同的不良结果。
更新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要调试shell脚本,请在开始处加上'set -x'。它会在执行它们时显示所有行。 – Barmar
是的,或者只是运行'bash -x foo.sh'。 – jlliagre