2011-03-28 72 views
3

我有一個bash腳本調用另一個bash腳本的時候,像這樣:bash腳本退出過早地調用另一個腳本里面

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

我已經是它永遠不會使它對打印的「Hello問題! 「

我認爲這是因爲./script-two.sh(我沒有寫)是以某種方式退出或更改shell。我在這篇文章的末尾添加了這個腳本。

有沒有一種方法可以讓我知道在script-two.sh執行後我的執行會繼續?

我已經看過使用陷阱命令,但我沒有完全理解它的正確使用。

感謝,

凱西

這裏是什麼是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" 

回答

10

看起來script-two.sh正在建立一個Ant構建環境的內容。

我認爲作者打算設置構建環境,然後手動鍵入構建命令,然後鍵入exit離開構建環境。

我這樣說是因爲script-two.sh底線是:

"$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 

,使其只啓動一個shell腳本是否正在運行像./script-two.sh,但如果它來源如. 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` 

(兩者是等同的)

+0

謝謝你,這很好。我認爲你對script-two.sh內部的問題也是正確的,但我沒有寫,也不能更改代碼。 – 2011-03-28 15:53:24

0

那麼對於初學者,你可以用-x開關運行你的bash腳本,看看它是失敗的:

bash -x script-one.sh 

其次,如果你這樣調用第二個腳本:

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

它將繼續,只要script-two.sh乾淨地退出。再次,您可以針對該腳本運行-x腳本查找任何問題。

正如Mikel提到的那樣,請務必確保腳本的底部有exit

+1

我不認爲米克爾在腳本底部說了什麼'退出';他只是將其作爲一種退出由'script-two.sh'啓動的shell的機制。 – sarnold 2011-03-28 01:36:08

0

今天我有類似的問題,在挖掘我終於找到答案。

我正在調用的腳本(從我的腳本中)實際上在最後有一個0退出。刪除該問題解決了我的問題。

只是在這裏留下,因爲有人可能會覺得它有用。