Я написал быстрый и грязный скрипт для определения времени некоторых отчетов из веб-службы:
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
shell
io-redirection
subshell
иконоборец
источник
источник
{ … }
вместо подоболочки( … )
.Товарищи по U & L: Прежде чем понизить мой ответ об использовании C-стиля с
main()
функцией, перейдите по этой ссылке: https://unix.stackexchange.com/a/313561/85039 Использование основных функций в сценариях - распространенная практика, используемая многими профессионалами. в поле.Как указал Жиль, подоболочки не могут делать переменные доступными вне их среды. Но давайте подойдем к этой проблеме с другой стороны - если вы пишете свой скрипт в функциях, можно объявить переменную как
local
и которую можно редактировать.Из руководства bash 4.3,
local
описание:Пример:
Как вы можете видеть после 3 итераций функции зацикливания, переменная изменяется.
источник
outter
бы сослаться на глобальный экземплярvar
."$var"
не требуется в вызовеoutter
. Это ничего не делает. И тожеlocal var=0
ничего не делает; вызов oufoutter
перезаписываетvar
, как вы заявили."$var"
как позиционный аргументoutter
; честно говоря, это по привычке. Можете ли вы уточнить, какlocal var=0
расстаться?