Команда [
для оценки условных выражений. Это бесполезно здесь.
Поскольку 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