Команда [для оценки условных выражений. Это бесполезно здесь.
Поскольку umountничего не выводит на стандартный вывод (ошибки идут в stderr), `sudo umount mount`ничего не расширяется.
Так что это как:
while [ ]
do
sleep 0.1
done
Команда [, когда не передается ни одного аргумента, [и ]возвращает false (ненулевой статус выхода), поэтому вы не будете входить в цикл.
Даже если бы umountон выводил свои ошибки на стандартный вывод, использование [команды не имело бы смысла, потому что слова, полученные в результате этого вывода, никогда бы не составили действительное условное выражение.
Здесь вы хотите:
until sudo umount mount
do
sleep 0.1
done
То есть вы хотите проверить состояние выхода sudo / umount, а не [команды.
Если вы хотите проверить, umountвыводит ли какая-либо ошибку или предупреждение на его stderr, это [может быть полезно. Это -n "some-string"условное выражение, распознаваемое [командой для проверки, "some-string"является ли оно пустым или нет, поэтому что-то вроде:
while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
sleep 0.1
done
Но искать наличие сообщений об ошибках или предупреждений, как правило, плохая идея. Команда umount сообщает нам, удастся ли ей с ее кодом выхода, это намного надежнее. Это может быть успешным и все равно вывести какое-то предупреждение. Может произойти сбой и не выдаст ошибку (например, когда он убит).
В этом конкретном случае обратите внимание, что umountможет произойти сбой, потому что каталог не смонтирован, и в этом случае вы бы зациклились навсегда, поэтому вы можете попробовать другой подход, такой как:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
Или, если «mount» может быть смонтирован несколько раз, и вы хотите размонтировать их все:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done