在调用其中的另一个脚本时,Bash脚本过早退出

时间:2011-03-28 01:19:54

标签: bash

我有一个bash脚本调用另一个bash脚本,如下所示:

#!/bin/bash
echo "Hi"
./script-two.sh
echo "Hello!"

我遇到的问题是它永远不会打印“你好!”

我认为这是因为./script-two.sh(我没写过)以某种方式退出或更改shell。我在这篇文章的最后添加了这个脚本。

有没有办法可以在script-two.sh执行后继续执行我的执行?

我已经研究过使用trap命令,但我并没有完全理解它的正确使用。

谢谢,

凯西

以下是script-two.sh

的内容
    #!/bin/sh
#  This file is part of the DITA Open Toolkit project hosted on 
#  Sourceforge.net. See the accompanying license.txt file for 
#  applicable licenses.
#  (c) Copyright IBM Corp. 2006 All Rights Reserved.

export DITA_HOME=cwd


if  [ "${DITA_HOME:+1}" != "1" ]; then 
   echo "DITA_HOME environment variable is empty or not set";
   exit 127;
fi

echo $DITA_HOME

cd "$DITA_HOME"

# Get the absolute path of DITAOT's home directory
DITA_DIR="`pwd`"

echo $DITA_DIR

if [ -f "$DITA_DIR"/tools/ant/bin/ant ] && [ ! -x "$DITA_DIR"/tools/ant/bin/ant ]; then
chmod +x "$DITA_DIR"/tools/ant/bin/ant
fi

export ANT_OPTS="-Xmx512m $ANT_OPTS"
export ANT_OPTS="$ANT_OPTS -Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl"
export ANT_HOME="$DITA_DIR"/tools/ant
export PATH="$DITA_DIR"/tools/ant/bin:"$PATH"

NEW_CLASSPATH="$DITA_DIR/lib:$DITA_DIR/lib/dost.jar:$DITA_DIR/lib/commons-codec-1.4.jar:$DITA_DIR/lib/resolver.jar:$DITA_DIR/lib/icu4j.jar"
NEW_CLASSPATH="$DITA_DIR/lib/saxon/saxon9.jar:$DITA_DIR/lib/saxon/saxon9-dom.jar:$NEW_CLASSPATH"
NEW_CLASSPATH="$DITA_DIR/lib/saxon/saxon9-dom4j.jar:$DITA_DIR/lib/saxon/saxon9-jdom.jar:$NEW_CLASSPATH"
NEW_CLASSPATH="$DITA_DIR/lib/saxon/saxon9-s9api.jar:$DITA_DIR/lib/saxon/saxon9-sql.jar:$NEW_CLASSPATH"
NEW_CLASSPATH="$DITA_DIR/lib/saxon/saxon9-xom.jar:$DITA_DIR/lib/saxon/saxon9-xpath.jar:$DITA_DIR/lib/saxon/saxon9-xqj.jar:$NEW_CLASSPATH"
if test -n "$CLASSPATH"
then
export CLASSPATH="$NEW_CLASSPATH":"$CLASSPATH"
else
export CLASSPATH="$NEW_CLASSPATH"
fi

"$SHELL"

3 个答案:

答案 0 :(得分:10)

看起来script-two.sh正在设置一个ant构建环境。

我认为作者打算设置构建环境,然后手动输入构建命令,然后键入exit以离开构建环境。

我这样说是因为script-two.sh的底线是:

"$SHELL"

启动一个新shell。

尝试运行脚本,然后输入exit。我认为在您输入Hello!后,您会看到它打印exit


我猜你正在尝试做类似的事情:

#!/bin/bash
echo "Hi"
./script-two.sh
ant <some args>

要做到这一点,你真正想做的就是通过改变:

来获取它
./script-two.sh

. script-two.sh

e.g。

#!/bin/bash
echo "Hi"
. script-two.sh
ant <some args>

但是,您需要修改script-two.sh并更改:

"$SHELL"

为:

case $0 in *script-two.sh)
    # executed, start a new shell with the new environment
    "$SHELL" 
    ;;
*)
    # sourced, don't start a new shell
    ;;
esac

因此,如果脚本像./script-two.sh一样运行,它只会启动一个shell,但如果它的来源类似. script-two.sh则不会。

或者如果你绝对无法改变script-two.sh,那么你可以这样做:

#!/bin/bash
echo "Hi"
. script-two.sh </dev/null
ant <some args>

会使"$SHELL"退出,因为它没有输入。


另外

export DITA_HOME=cwd

对我来说似乎不对。

应该是

export DITA_HOME=$(pwd)

export DITA_HOME=`pwd`

(两者都相同)

答案 1 :(得分:0)

首先,您可以使用-x开关执行bash脚本以查看失败的位置:

bash -x script-one.sh

其次,如果你这样调用第二个脚本:

#!/bin/bash
echo "Hi"
var=$(bash script-two.sh)
echo "Hello!"

只要script-two.sh干净利落,它就会继续。同样,您可以针对该脚本运行-x脚本以发现任何问题。

正如米克尔所提到的,请始终确保脚本底部有exit

答案 2 :(得分:0)

今天我遇到了类似的问题,在挖掘方面,我终于找到了答案。

我调用的脚本(在我的脚本中)实际上最后有一个退出0。删除修复我的问题。

将此留在这里可能会发现它很有用。