Как сделать переменную из подоболочки доступной в родительской оболочке

Я написал быстрый и грязный сценарий для получения некоторых отчетов из веб-службы:

BASE_URL='http://example.com/json/webservice/' FIRST=1 FINAL=10000 for report_code in $(seq 1 $FINAL); do (time -p response=$(curl --write-out %{http_code} --silent -O ${BASE_URL}/${report_code}) ) 2> ${report_code}.time echo $response # <------- this is out of scope! How do I fix that? if [[ $response = '404' ]]; then echo "Deleting report # ${report_code}!" rm ${report_code} else echo "${report_code} seems to be good!" fi done 

Мне нужно обернуть команду time в подоболочку, чтобы я мог перенаправить ее вывод, но это делает значение $response недоступным для родительской оболочки. Как мне обойти эту проблему?

  • Как выполнить bash (в скрипте) с собственным файлом .bash_logout?
  • zsh: подстановка команды не наследует stdin из родительского
  • bash syntax - команда обертывания внутри sudo :: tail logs до тех пор, пока строка не будет найдена с таймаутом с использованием Terraform
  • Невозможно grep список заданий, когда задания, вызванные функцией
  • Flock, похоже, не работает
  • Могу ли я перенаправить вывод программы на кошку с помощью трубы?
  • Восстановление tty с помощью stty
  • Создание подошвы Bash с фигурными фигурными скобками
  • 2 Solutions collect form web for “Как сделать переменную из подоболочки доступной в родительской оболочке”

    Вы не можете принести значение переменной от подоболочки к ее родительскому элементу, не выполняя некоторую подверженную ошибкам сортировку и громоздкую связь.

    К счастью, здесь вам не нужна подоболочка. Перенаправление требует только группировки команд с помощью { … } , а не подоболочки.

     { time -p response=$(curl --write-out '%{http_code}' --silent -O "${BASE_URL}/${report_code}"); } 2> "${report_code}.time" 

    (Не забывайте двойные кавычки вокруг переменных замещений .)

    Учредители U & L: Прежде чем опробовать мой ответ для использования функции C-стиля с функцией main() , перейдите по этой ссылке: https://unix.stackexchange.com/a/313561/85039 Использование основных функций в скриптах – обычная практика, используется многими профессионалами в этой области.


    Как указал Жиль, подоболочки не могут сделать переменные доступными вне окружающей среды. Но давайте подходим к этой проблеме под другим углом – если вы напишете свой скрипт в функциях, можно объявить переменную как local и которая может быть отредактирована.

    Из руководства по bash 4.3, local описание:

    … Когда локально используется внутри функции, это приводит к тому, что имя переменной имеет видимую область действия, ограниченную этой функцией, и ее дочерние элементы …

    Пример:

     #!/bin/bash outter() { for i in $(seq 1 3) do var=$i done } main() { local var=0 outter "$var" echo $var } main "$@" $ ./testscript.sh 3 

    Как вы можете видеть после трех итераций функции циклирования, переменная изменяется.

    Linux и Unix - лучшая ОС в мире.