J'ai écrit un script rapide et sale pour chronométrer certains rapports d'un service Web:
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
J'ai besoin d'envelopper la time
commande dans un sous-shell afin que je puisse rediriger sa sortie, mais cela rend la valeur de $response
indisponible pour le shell parent. Comment contourner ce problème?
bash
shell
io-redirection
subshell
iconoclaste
la source
la source
{ … }
au lieu d'un sous-shell( … )
.Chers utilisateurs U&L: Avant de voter contre ma réponse pour l'utilisation du style C avec la
main()
fonction, veuillez visiter ce lien: https://unix.stackexchange.com/a/313561/85039 L' utilisation des fonctions principales dans les scripts est une pratique courante, utilisée par de nombreux professionnels Sur le terrain.Comme l'a souligné Gilles, les sous-coquilles ne peuvent pas rendre les variables disponibles en dehors de leur environnement. Mais abordons ce problème sous un autre angle - si vous écrivez votre script dans des fonctions, il est possible de déclarer une variable comme
local
et qui peut être éditée.Du manuel de bash 4.3,
local
description:Exemple:
Comme vous pouvez le voir après 3 itérations de la fonction de bouclage, la variable est modifiée.
la source
outter
faire référence à une instance globale devar
."$var"
n'est pas nécessaire dans l'appeloutter
. Cela ne fait rien. Etlocal var=0
ne fait rien non plus; l'appel oufoutter
écrasevar
, comme vous l'avez dit."$var"
comme argument positionnel pouroutter
; pour être juste, c'est par habitude. Pouvez-vous élaborer sur lalocal var=0
partie?