O comando [
é avaliar expressões condicionais. Não tem utilidade aqui.
Como umount
não produz nada em sua saída padrão (os erros vão para stderr), 'sudo umount mount'
se expande para nada.
Então é como:
while [ ]
do
sleep 0.1
done
O comando [
, quando não passou nenhum argumento ao lado de [
e ]
retorna falso (um status de saída diferente de zero), portanto você não inserirá o loop.
Mesmo se umount
tivesse produzido seus erros no stdout, usar o comando [
não faria sentido, porque as palavras resultantes dessa saída nunca teriam criado 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ê quisesse verificar se umount
gerou algum erro ou aviso no seu stderr, é aí que o [
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 de aviso é geralmente uma má ideia. O comando umount
nos informa se ele é ou não bem-sucedido com seu código de saída, isso é muito mais confiável. Pode ter sucesso e ainda produzir alguma mensagem de aviso. Pode falhar e não produzir um erro (como quando é morto).
Nesse caso em particular, observe que umount
pode falhar porque o diretório não está montado e você daria um loop para sempre nesse caso, portanto, poderia tentar outra abordagem como:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
Ou se "montar" pode ser montado várias vezes e você deseja desmontar todos:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done