How to make a variable from a subshell available in the parent shell
You can't bring a variable's value from a subshell to its parent, not without doing some error-prone marshalling and cumbersome communication.
Fortunately, you don't need a subshell here. Redirection only requires command grouping with { … }
, not a subshell.
{ time -p response=$(curl --write-out '%{http_code}' --silent -O "${BASE_URL}/${report_code}"); } 2> "${report_code}.time"
(Don't forget double quotes around variable substitutions.)
Fellow U&L users: Before downvoting my answer for using C-style with main()
function, please visit this link: https://unix.stackexchange.com/a/313561/85039 Using main functions in scripts is a common practice, used by many professionals in the field.
As Gilles pointed out, subshells cannot make variables available outside of their environment. But let's approach this problem from another angle - if you write your script in functions, it's possible to declare variable as local
and that can be edited.
From bash 4.3's manual, local
description:
...When local is used within a function, it causes the variable name to have a visible scope restricted to that function and its children...
Example:
#!/bin/bash
outter()
{
for i in $(seq 1 3)
do
var=$i
done
}
main()
{
local var=0
outter
echo $var
}
main "$@"
$ ./testscript.sh
3
As you can see after 3 iterations of the looping function, the variable is modified.