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

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

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

  • Невозможно grep список заданий, когда задания, вызванные функцией
  • Как получить PID подоболочки в Korn Shell (эквивалент $ BASHPID)
  • фигурные скобки и подоболочка
  • Восстановление tty с помощью stty
  • Строка состояния Tmux мигает командой из # () перед отображением результата
  • Использование подоболочки для передачи параметров с пробелами
  • Заполнение вкладки Bash происходит не в подстановке команд
  • Как выполнить bash (в скрипте) с собственным файлом .bash_logout?
  • 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 

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

    Interesting Posts

    Установите Arch Linux на существующий раздел ext4

    как использовать rpmbuild для el5 на системе el6

    Переменная окружения не сохраняется для JRE_HOME с sudoers

    Loopback весь полученный трафик на интерфейсе

    Отключите инструмент настройки в Zsh

    Сохранить изображение как 24 бит png

    Каковы минимальные требования для запуска графического приложения?

    cpu измерение времени с помощью wait4 vs. cpuacct cgroup

    Открытие командной строки в текстовом редакторе – что это называется?

    Измерение использования ОЗУ в программе

    Преобразование относительного пути в абсолютный путь

    Почему вывод команды hostname отличается от / etc / hosts?

    Что делает Linux по-другому, что позволяет мне удалять / заменять файлы, в которых Windows будет жаловаться на файл, который в настоящее время используется?

    Учитывая команду * nix, как мне найти, где находится исполняемый файл?

    Как вы перемещаете все файлы (включая скрытые) из одного каталога в другой?

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