He escrito un script rápido y sucio para cronometrar algunos informes de un servicio 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
Necesito ajustar el timecomando en un subshell para poder redirigir su salida, pero eso hace que el valor de $responseno esté disponible para el shell principal. ¿Cómo soluciono este problema?
bash
shell
io-redirection
subshell
iconoclasta
fuente
fuente

{ … }lugar de una subshell( … ).Compañeros usuarios de U&L: antes de rechazar mi respuesta para usar el estilo C con la
main()función, visite este enlace: https://unix.stackexchange.com/a/313561/85039 El uso de las funciones principales en los scripts es una práctica común, utilizada por muchos profesionales en el campo.Como señaló Gilles, las subcapas no pueden hacer que las variables estén disponibles fuera de su entorno. Pero abordemos este problema desde otro ángulo: si escribe su script en funciones, es posible declarar variables como
localy eso se puede editar.Del manual de bash 4.3,
localdescripción:Ejemplo:
Como puede ver después de 3 iteraciones de la función de bucle, la variable se modifica.
fuente
outterreferirme a una instancia global devar."$var"No es necesario en la llamadaoutter. No hace nada Y tampocolocal var=0hace nada; la llamada oufouttersobrescribevar, como usted dijo."$var"como argumento posicional paraoutter; para ser justos, esto es por costumbre. ¿Se puede elaborar en cuanto alocal var=0parte?