当函数被唤醒时,Bash全局变量不会改变

时间:2011-04-11 13:29:00

标签: bash shell

我想调用函数“B”并传递另一个函数名称(A1,A2等),它将从中调用。在这个函数中,传递了哪个名称,我初始化了几个变量,但我无法从“B”函数中读取它们。

function A1
{
    echo "func 1"
    result1="a1"
    return 0
}

function A2
{
    echo "func 2"
    anotherResult="a2"
    #..some other initialization
    return 0
}
#...

function B
{
    output=`$1` #  $1 - function name
    echo output=$output
    echo result1=$result1 # <--- ERROR! result1 is empty!
}

B "A1" # main script runs function B and passes other function name

1 个答案:

答案 0 :(得分:4)

您的功能B不会拨打A1。

请注意,output=$($1)将无法满足您的期望,因为$(...)内运行的任何内容都将在不同的进程中执行,并且当该进程终止时,您设置的值将无法访问不再。

所以:

function B
{
    output=\`$1\` # <-- this will not call the $1 but will only print it

    output=`$1`   # <-- ( $($1) is a better style ) - will call whatever 
                  #     inside $1, but in another process

    $1            # <-- here is the missing call in the current process.
    ...
}

您可以使用重定向,例如A1 > tmpfile文件或命名管道,通过文件系统获取输出,同时保持当前进程的副作用:

function B
{
    $1 > tempfile
    read output < tempfile

    echo output=$output
    echo result1=$result1
}

将按预期执行,但会在您的文件系统上使用tempfile