8

説明できない奇妙な動作を見つけました。次のコードは正常に動作します。

function prepare-archive {
blah-blah-blah...
_SPEC_FILE=$(check-spec-file "$_GIT_DIR/packaging/")
exit $?
blah-blah-blah...
}

私が期待する価値を得ることを意味します:

bash -x ./this-script.sh:
++ exit 1
+ _SPEC_FILE='/home/likern/Print/Oleg/print-service/packaging/print-service.spec
/home/likern/Print/Oleg/print-service/packaging/print-service2.spec'
+ exit 1

local変数に定義を追加するとすぐに:

local _SPEC_FILE=$(check-spec-file "$_GIT_DIR/packaging/")

私は次のようになります:

bash -x ./this-script.sh:
++ exit 1
+ local '_SPEC_FILE=/home/likern/Print/Oleg/print-service/packaging/print-service.spec
/home/likern/Print/Oleg/print-service/packaging/print-service2.spec'
+ exit 0
$:~/MyScripts$ echo $?
0

質問:なぜですか? 何が起きたの?サブシェルからlocal変数への出力をキャッチして、サブシェルの戻り値を確実にチェックできますか?

PS :prepare-archiveメイン シェル スクリプトで呼び出されます。1 つ目exitexitfromcheck-spec-file関数、2 つ目は fromprepare-archive関数です。この関数自体はメイン シェル スクリプトから実行されます。check-spec-filebyから値を返しexit 1、この値を に渡しますexit $?。したがって、それらは同じであるべきだと思います。

4

3 に答える 3

19

サブシェルの終了ステータスをキャプチャするには、割り当ての前に変数をローカルとして宣言します。たとえば、次のスクリプト

#!/bin/sh

local_test()
{
    local local_var
    local_var=$(echo "hello from subshell"; exit 1)
    echo "subshell exited with $?"
    echo "local_var=$local_var"
}

echo "before invocation local_var=$local_var in global scope"
local_test
echo "after invocation local_var=$local_var in global scope"

次の出力を生成します

before invocation local_var= in global scope
subshell exited with 1
local_var=hello from subshell
after invocation local_var= in global scope
于 2013-05-11T19:56:12.190 に答える
5

bash マニュアルのShell Builtin Commandsセクションから:

local:
    [...]The return status is zero unless local is used outside a function, an invalid name is supplied, or name is a readonly variable. 

これが役立つことを願っています=)

于 2012-10-11T13:49:03.023 に答える