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 time
comando en un subshell para poder redirigir su salida, pero eso hace que el valor de $response
no 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
local
y eso se puede editar.Del manual de bash 4.3,
local
descripción:Ejemplo:
Como puede ver después de 3 iteraciones de la función de bucle, la variable se modifica.
fuente
outter
referirme a una instancia global devar
."$var"
No es necesario en la llamadaoutter
. No hace nada Y tampocolocal var=0
hace nada; la llamada oufoutter
sobrescribevar
, como usted dijo."$var"
como argumento posicional paraoutter
; para ser justos, esto es por costumbre. ¿Se puede elaborar en cuanto alocal var=0
parte?