O [
comando é avaliar expressões condicionais. É inútil aqui.
Como umount
nã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 umount
tivesse 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á umount
algum 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 umount
pode 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