4

私はこのBashスクリプトを持っています:

#!/bin/bash
set -x
function doSomething() {
    callee
    echo "It should not go to here!"
}

function callee() {
    ( echo "before" ) && (echo "This is callee" && exit 1 )                                                                                   
    echo "why I can see this?"
}


doSomething

そしてこれは結果です:

+ set -x
+ doSomething
+ callee
+ echo before
before
+ echo 'This is callee'
This is callee
+ exit 1
+ echo 'why I can see this?'
why I can see this?
+ echo 'It should not go to here!'
It should not go to here!

コマンドexitが表示されますが、スクリプトが終了しません–なぜ機能しないexitのですか?

4

3 に答える 3

5

サブシェル内から呼び出しexitているため、それが終了するシェルです。代わりにこれを試してください:

function callee() {
    ( echo "before" ) && { echo "This is callee" && exit 1; }                                                                                   
    echo "why I can see this?"
}

ただし、これは、呼び出されたシェルから終了しcalleeます。関数から戻るreturn代わりに使用したい場合があります。exit

于 2012-09-04T14:52:28.583 に答える
3

コマンドを実行すると()、サブシェルが生成されます。したがって、exitそのサブシェル内で呼び出すと、最上位のスクリプトではなく、終了するだけです。

于 2012-09-04T14:52:48.167 に答える
1

丸括弧は新しいネストされたシェルを作成し、exit で終了するためです。

于 2012-09-04T14:53:03.853 に答える