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

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

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 недоступным для родительской оболочки. Как мне обойти эту проблему?

  • Unix calculator.bash имеет проблемы
  • Bash-completion и grep
  • Использование «$ {a: -b}» для назначения переменных в скриптах
  • Извлечение уникальной части текста из файла с помощью awk, sed или grep
  • Как избежать одиночных или двойных кавычек при передаче переменной в bash-скрипт?
  • Может ли IFS (внутренний разделитель полей) функционировать как отдельный разделитель для нескольких последовательных разделительных символов?
  • Невозможно изменить оболочку bash в Mac OS X
  • Есть ли команда, показывающая время, прошедшее при длительном процессе?
  • Что это означает от xev?
  • Оболочка оболочки оболочки для предотвращения запуска команды без аргументов?
  • Разница между выполнением нескольких команд с && и;
  • Как я могу передавать данные в программу, которая ожидает чтения данных из файла, который указан в качестве аргумента?
  • 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 - лучшая ОС в мире.