Il [
comando è valutare le espressioni condizionali. Non serve a niente qui.
Perché umount
non genera nulla sul suo output standard (gli errori vanno a stderr), non si `sudo umount mount`
espande a nulla.
Quindi è come:
while [ ]
do
sleep 0.1
done
Il [
comando, quando non passa alcun argomento accanto [
e ]
restituisce false (uno stato di uscita diverso da zero), quindi non entrerai nel ciclo.
Anche se umount
avesse generato i suoi errori su stdout, l'uso del [
comando non avrebbe avuto senso, perché le parole risultanti da quell'output non avrebbero mai costituito un'espressione condizionale valida.
Qui vuoi:
until sudo umount mount
do
sleep 0.1
done
Cioè, si desidera controllare lo stato di uscita di sudo / umount, non di un [
comando.
Se volessi verificare se umount
emetteva qualche errore o avvertimento sul suo standard, è qui che [
avrebbe potuto essere utile. È -n "some-string"
un'espressione condizionale riconosciuta dal [
comando per verificare se "some-string"
è vuota o meno, quindi qualcosa di simile a:
while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
sleep 0.1
done
Ma cercare la presenza di messaggi di errore o di avviso è generalmente una cattiva idea. Il umount
comando ci dice se riesce o meno con il suo codice di uscita, è molto più affidabile. Potrebbe avere successo e comunque generare un messaggio di avviso. Potrebbe non riuscire e non generare un errore (come quando viene ucciso).
In questo caso particolare, tieni presente che umount
potrebbe non riuscire perché la directory non è montata e in quel caso eseguiresti un ciclo per sempre, quindi potresti provare un altro approccio come:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
O se "mount" può essere montato più volte e si desidera smontarli tutti:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done