gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:17:49 25 4
gpt4 key购买 nike

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

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

我遇到的问题是它永远无法打印“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"

最佳答案

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

我认为作者的意图是设置构建环境,然后您手动输入构建命令,然后输入exit 离开构建环境。

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

"$SHELL"

这会启动一个新的 shell。

尝试运行您的脚本,然后键入 exit。我想您会在键入 exit 后看到它打印 Hello!


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

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

要做到这一点,您真正想要做的是获取它,通过更改:

./script-two.sh

. script-two.sh

例如

#!/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`

(两者等价)

关于Bash 脚本在调用其中的另一个脚本时过早退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5453767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com