Eu finalmente encontrei um jeito.
Como se vê, já que o que eu realmente quero fazer é verificar o link, não preciso de ifup . Em vez disso, posso usar ethtool (embora tenha que ser instalado primeiro), assim:
connected=$(ethtool eth0 | awk '/Link detected:/ { print $3 }')
Se, no entanto, eu precisasse verificar ifup , eu poderia usar um processo em segundo plano e a variável $! shell. Se eu quisesse verificar se ainda estava em execução após o tempo limite, poderia fazer isso:
ifup eth0 &
sleep 5
if ps -p $! | grep -q "$!"; then
connected='no'
kill $!
else
connected='yes'
fi
Se eu quisesse capturar a saída de ifup , minha melhor aposta seria redirecionar para um arquivo temporário. (Eu olhei em pipes nomeados, mas eu não acho que eles funcionariam para esse propósito; ifup iria bloquear até que outro processo estivesse lendo sua saída).