我有一个bash脚本调用另一个bash脚本,如下所示:
#!/bin/bash
echo "Hi"
./script-two.sh
echo "Hello!"
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是它永远不会打印"你好!"
我想这是因为./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"
Run Code Online (Sandbox Code Playgroud)
Mik*_*kel 10
它看起来像是script-two.sh在建立一个ant构建环境.
我认为作者打算设置构建环境,然后手动键入构建命令,然后键入exit以离开构建环境.
我这样说是因为底线script-two.sh是:
"$SHELL"
Run Code Online (Sandbox Code Playgroud)
这会启动一个新shell.
尝试运行脚本,然后键入exit.我想你会Hello!在打字后看到它打印出来exit.
我猜你正在尝试做类似的事情:
#!/bin/bash
echo "Hi"
./script-two.sh
ant <some args>
Run Code Online (Sandbox Code Playgroud)
要做到这一点,你真正想要做的就是通过改变:
./script-two.sh
Run Code Online (Sandbox Code Playgroud)
至
. script-two.sh
Run Code Online (Sandbox Code Playgroud)
例如
#!/bin/bash
echo "Hi"
. script-two.sh
ant <some args>
Run Code Online (Sandbox Code Playgroud)
但是,您需要编辑script-two.sh和更改:
"$SHELL"
Run Code Online (Sandbox Code Playgroud)
至:
case $0 in *script-two.sh)
# executed, start a new shell with the new environment
"$SHELL"
;;
*)
# sourced, don't start a new shell
;;
esac
Run Code Online (Sandbox Code Playgroud)
因此,如果脚本正在运行,它只会启动一个shell ./script-two.sh,但如果它的来源是这样的话,则不会. script-two.sh.
或者,如果你绝对无法改变script-two.sh,那么你可以这样做:
#!/bin/bash
echo "Hi"
. script-two.sh </dev/null
ant <some args>
Run Code Online (Sandbox Code Playgroud)
"$SHELL"因为它没有输入,所以会欺骗退出.
也
export DITA_HOME=cwd
Run Code Online (Sandbox Code Playgroud)
对我来说似乎不对.
它可能应该是
export DITA_HOME=$(pwd)
Run Code Online (Sandbox Code Playgroud)
要么
export DITA_HOME=`pwd`
Run Code Online (Sandbox Code Playgroud)
(两者都相同)