Eu escrevi um script rápido e sujo para cronometrar alguns relatórios de um serviço da 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
Preciso agrupar o time
comando em um subshell para poder redirecionar sua saída, mas isso torna o valor $response
indisponível para o shell pai. Como contornar esse problema?
bash
shell
io-redirection
subshell
iconoclasta
fonte
fonte
{ … }
vez de um subshell( … )
.Usuários de U&L: Antes de votar minha resposta para usar o estilo C com
main()
função, visite este link: https://unix.stackexchange.com/a/313561/85039 O uso de funções principais em scripts é uma prática comum, usada por muitos profissionais no campo.Como Gilles apontou, os subshells não podem disponibilizar variáveis fora de seu ambiente. Mas vamos abordar esse problema de outro ângulo - se você escrever seu script em funções, é possível declarar a variável como
local
e que pode ser editada.Do manual do bash 4.3,
local
descrição:Exemplo:
Como você pode ver após 3 iterações da função de loop, a variável é modificada.
fonte
outter
me referir a uma instância global devar
."$var"
não é necessário na chamadaoutter
. Não faz nada. E tambémlocal var=0
não faz nada; a chamada oufoutter
sobrescrevevar
, como você afirmou."$var"
como argumento posicional paraoutter
; para ser justo, isso é um hábito. Você pode elaborar quanto àlocal var=0
parte?