O [comando é avaliar expressões condicionais. É inútil aqui.
Como umountnão produz nada em sua saída padrão (os erros vão para stderr), `sudo umount mount`expande para nada.
Então é assim:
while [ ]
do
sleep 0.1
done
O [comando, quando não passado nenhum argumento ao lado [e ]retorna false (um status de saída diferente de zero), portanto você não entrará no loop.
Mesmo se umounttivesse produzido seus erros no stdout, o uso do [comando não faria sentido, porque as palavras resultantes dessa saída nunca formariam uma expressão condicional válida.
Aqui você quer:
until sudo umount mount
do
sleep 0.1
done
Ou seja, você deseja verificar o status de saída de sudo / umount, não de um [comando.
Se você quiser verificar se há umountalgum erro ou aviso em seu stderr, é aí que [poderia ter sido útil. O -n "some-string"é uma expressão condicional reconhecida pelo [comando para testar se "some-string"está vazio ou não, então algo como:
while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
sleep 0.1
done
Mas procurar a presença de mensagens de erro ou aviso geralmente é uma má ideia. O umount comando nos diz se é bem-sucedido ou não com seu código de saída, isso é muito mais confiável. Pode ter sucesso e ainda gerar alguma mensagem de aviso. Pode falhar e não gerar um erro (como quando é morto).
Nesse caso específico, observe que umountpode falhar porque o diretório não está montado, e você faria um loop para sempre nesse caso, para tentar outra abordagem como:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
Ou se "mount" pode ser montado várias vezes e você deseja desmontar todos eles:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done