Как использовать одну и ту же переменную bash между родительской и дочерней оболочками - PullRequest
5 голосов
/ 08 декабря 2010

У меня есть скрипт bash, подобный следующему:


function test
{
   running=$(( $running - 1 ))
}

running=0
test &
echo $running


Поскольку тестовая функция запускается в вложенной оболочке, она не влияет на рабочую переменную, и я получаю 0, отображаемое на экране. Мне нужно, чтобы вспомогательная оболочка могла изменять переменные родительских оболочек, как это можно сделать? Я пытался экспортировать, но безрезультатно.

РЕДАКТИРОВАТЬ Спасибо за все полезные ответы. Причина, по которой я хочу запустить эту функцию в фоновом режиме, состоит в том, чтобы разрешить запуск нескольких функций одновременно. Мне нужно иметь возможность перезвонить родительскому скрипту, чтобы сообщить ему, когда все функции будут завершены. Я использовал pids для этого, но мне не нравится проверять, постоянно ли в цикле несколько процессов.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Вы не можете на самом деле. У каждой оболочки есть копия окружения.

см. Может ли скрипт оболочки устанавливать переменные окружения вызывающей оболочки?

Но для того, что вы делаете в своем примере, попробуйте это как ваш скрипт:

#!/bin/bash

function testSO
{    
    running=$(( $running - 1 ));
    return $running;
}

и вызвать его как:

running=$(testSO)

Если вы хотите только эффективно вернуть значение, просто верните значение из функции.

0 голосов
/ 09 декабря 2010

Используйте псевдонимы вместо функций. Или написать скрипт с телом функции и выполнить его с source.

Оба решения избегают создания под-оболочки.

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