Como você já descobriu, seu git clone
é chamado antes que sua conexão de rede esteja totalmente ativada. A única mágica que apt-get
provavelmente faz é demorar um pouco para consultar o banco de dados de pacotes local. Isso está dando tempo suficiente para que a rede seja ativada e configurada.
A razão pela qual seu segundo script não se comporta adequadamente é porque você está confundindo os códigos de retorno do programa. No bash, ou shell em geral, o número zero representa o valor booleano TRUE. Um programa que sai com êxito deve retornar o número zero. Assim, se seu ping (e grep) for bem-sucedido, você receberá zero valor de retorno e while 0
fará um loop para sempre.
retries=0
while ! ping -c1 github.com >/dev/null 2>&1; do
sleep 1
if (( retries++ > 10 )); then
echo "Max retries reached, aborting." >&2
exit 1
fi
done
git clone [email protected]:me/my-repo.git ~/my-repo
Para aumentar o detalhamento, remova o redirecionamento de saída do ping.
Eu acho que isso é um aviso óbvio, mas a segurança da sua configuração parece suspeita - você está baixando automaticamente as coisas do git com conta root ...