Глобальные переменные Bash не изменяются при удалении функций - PullRequest
1 голос
/ 11 апреля 2011

Я хочу вызвать функцию "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 Ответ

4 голосов
/ 11 апреля 2011

Ваша функция 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 в вашей файловой системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...