Subshells (GNU Parallel)
Naar navigatie springen
Naar zoeken springen
I have the impression that GNU Parallel creates a subshell and that precautions have to be taken to assure that functions and variables are available in that subshell.
Not that this subshell stuff is not the same as scope within a single shell
Without exported function or variable
################################################################################ # Subshell & vars? - Without exporting function or var ################################################################################ # # Function ######################################## # subfunction() { echo "Subfunction - Var j: $j" } # Main ######################################## # j=12 echo "Main - var j: $j" # parallel subfunction ::: $(seq 5)
Output:
Main - var j: 12 /bin/bash: subfunction: command not found /bin/bash: subfunction: command not found /bin/bash: subfunction: command not found /bin/bash: subfunction: command not found /bin/bash: subfunction: command not found
With exported function
Now the function is exported using export -f subfunction
and GNU Parallel can find it. However, the variable j
is not available within this function.
################################################################################ # Subshell & vars? - With exporting function ################################################################################ # # Function ######################################## # subfunction() { echo "Subfunction - Var j: $j" } # Main ######################################## # j=12 echo "Main - var j: $j" export -f subfunction # parallel subfunction ::: $(seq 5)
Output:
Main - var j: 12 Subfunction - Var j: Subfunction - Var j: Subfunction - Var j: Subfunction - Var j: Subfunction - Var j:
With exported function and exported variable
Juhu! Sometimes, things are easy:
################################################################################ # Subshell & vars? - With exporting function ################################################################################ # # Function ######################################## # subfunction() { echo "Subfunction - Var j: $j" } # Main ######################################## # j=12 echo "Main - var j: $j" export -f subfunction export j # parallel subfunction ::: $(seq 5)
Output:
Main - var j: 12 Subfunction - Var j: 12 Subfunction - Var j: 12 Subfunction - Var j: 12 Subfunction - Var j: 12 Subfunction - Var j: 12
But not for arrays
It seems that regular arrays and associate arrays cannot be exported to subshells:
################################################################################ # Subshell, var & arrays ################################################################################ # # Function ######################################## # subfunction() { echo "function - Var i: $i" echo "function - Associative array j: ${j[@]}" echo "function - Regular array k: ${k[@]}" } # Main ######################################## # i=12 declare -gA j j[foo,1]="Foo-1" j[bar,2]="Bar-2" k[1]="K1" k[2]="K2" echo "Main - var j: $i" export -f subfunction export i export j # Doesn't work export j[@] # Doesn't work export k # Doesn't work export k[@] # Doesn't work export {k[@]} # Doesn't work # parallel subfunction ::: $(seq 5)
Output:
Main - var j: 12 ./parallel.sh: line 181: export: `j[@]': not a valid identifier ./parallel.sh: line 183: export: `k[@]': not a valid identifier ./parallel.sh: line 184: export: `{k[@]}': not a valid identifier function - Var i: 12 function - Associative array j: function - Regular array k: function - Var i: 12 function - Associative array j: function - Regular array k: function - Var i: 12 function - Associative array j: function - Regular array k: function - Var i: 12 function - Associative array j: function - Regular array k: function - Var i: 12 function - Associative array j: function - Regular array k: