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

Bash脚本在调用其中的另一个脚本时过早退出,bash,Bash,我有一个bash脚本,它调用另一个bash脚本,如下所示: #!/bin/bash echo "Hi" ./script-two.sh echo "Hello!" 我的问题是,它从来没有打印“你好!” 我认为这是因为./script-two.sh(我没有编写)以某种方式退出或更改shell。我已经在这篇文章的末尾包含了这个脚本 是否有一种方法可以保证在script-two.sh执行之后,我的执行将继续 我已经研究过如何使用trap命令,但我并不完全理解它的用法 谢谢 凯西 下面是script-

我有一个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"

看起来像是
scripttwo.sh
正在设置一个ant构建环境

我认为作者希望它设置构建环境,然后手动键入构建命令,然后键入
exit
离开构建环境

我这样说是因为脚本2.sh的底线是:

"$SHELL"
它开始了一个新的外壳

尝试运行脚本,然后键入
exit
。我想你会看到它打印出来的
你好后退出


我猜你想做的是:

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

e、 g

致:

因此,只有当脚本像
/script two.sh那样运行时,它才会启动一个shell,但如果它像
那样源代码,它就不会启动。脚本2.sh

或者,如果您绝对无法更改脚本2.sh,则可以执行以下操作:

#!/bin/bash
echo "Hi"
. script-two.sh </dev/null
ant <some args>
我觉得不太对

应该是的

export DITA_HOME=$(pwd)


(两者都是等效的)

对于初学者,您可以使用-x开关执行bash脚本,以查看失败的地方:

bash -x script-one.sh
其次,如果您这样调用第二个脚本:

#!/bin/bash
echo "Hi"
var=$(bash script-two.sh)
echo "Hello!"
只要script-two.sh干净地退出,它就会继续。同样,您可以针对该脚本运行-x脚本以查找任何问题


正如Mikel提到的,始终确保脚本底部有
退出

我今天遇到了类似的问题,在挖掘过程中我终于找到了答案

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


把这个放在这里,让别人觉得有用。

我认为米克尔没有说在脚本底部有
exit
;他只是建议将其作为退出shell的一种机制,由
script two.sh
启动。谢谢,这非常有效。我认为你在script-two.sh中的问题上也是对的,但是我没有写,也不能修改代码。
case $0 in *script-two.sh)
    # executed, start a new shell with the new environment
    "$SHELL" 
    ;;
*)
    # sourced, don't start a new shell
    ;;
esac
#!/bin/bash
echo "Hi"
. script-two.sh </dev/null
ant <some args>
export DITA_HOME=cwd
export DITA_HOME=$(pwd)
export DITA_HOME=`pwd`
bash -x script-one.sh
#!/bin/bash
echo "Hi"
var=$(bash script-two.sh)
echo "Hello!"