Сценарии Bash - цикл до возвращаемого значения 0

Захват мыши при нажатии на любую пустую область в заголовке/строке меню в nautilius/evince/gnome-terminal/etc. происходит для меня на Ubuntu 11.10 / libgtk-3-0, 3.2.0-0ubuntu6 / потрясающие 3.4.10-1 также.

A killall nautilus или так на консоли выпускает захват мыши; с Наутилусом, просто закрыв окно с a Meta-c не помогает.

Кажется, существует фиксация для проблемы изменять-размер-дескриптора, предстающей конвейер перед GTK + 3.3.6, presumeably связана?

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=630972
https://bugzilla.gnome.org/show_bug.cgi? id=650943
http://git.gnome.org/browse/gtk+/tree/NEWS#n301
http://git.gnome.org/browse/gtk+/commit/?id=e3005ea454293d7b86f2bc39ba5fd028906b5c72

25
07.06.2013, 01:32
2 ответа

[ команда должна оценить условные выражения. Это бесполезно здесь.

Поскольку umount ничего не производит на его стандартном выводе (ошибки переходят к stderr), `sudo umount mount` ни до чего не расширяется.

Таким образом, это похоже:

while [ ]
do
  sleep 0.1
done

[ команда при отсутствии передачи никакой аргумент около [ и ] возвращает false (ненулевой статус выхода), таким образом, Вы не введете цикл.

Даже если umount произвел его ошибки на stdout, с помощью [ команда не имела бы смысла, потому что слова, получающиеся из того вывода, никогда не будут составлять допустимое условное выражение.

Здесь Вы хотите:

until sudo umount mount
do
  sleep 0.1
done

Таким образом, Вы хотите проверить статус выхода sudo/umount, не a [ команда.

Если Вы хотели проверить если 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

Или если "монтирование" может несколько раз монтироваться, и Вы хотите размонтировать их всех:

while mountpoint -q mount; do
  sudo umount mount || sleep 0.1
done
58
27.01.2020, 19:40
  • 1
    Работы, потрясающие! –  charliehorse55 07.06.2013, 01:52
  • 2
    +1 для объяснения различия между использованием [, [[ или нет. Я желаю типичных страниц справочника, GNU и/или примеры TLDP об условных выражениях удара покрыли такой –  renoirb 26.06.2016, 05:24

допускающая повторное использование функция, и будет тайм-аут в 'n' секунды

_umount() {
    [[ $# -lt 2 ]] && { 
        echo "Usage: ${FUNCNAME} <timeout_secs> <mnt_point>"; return 1
    }
    timeout=$(($(date +%s) + ${1}))
    until umount "${2}" 2>/dev/null || [[ $(date +%s) -gt $timeout ]]; do
       :
    done
}

никакая потребность спать

5
27.01.2020, 19:40
  • 1
    [[...]] ksh/bash/zsh конкретный, все из которых имеют $SECONDS специальная переменная, таким образом, Вы могли сделать: SECONDS=0; until umount... || ((SECONDS > $1)); do.. –  Stéphane Chazelas 01.08.2017, 15:43

Теги

Похожие вопросы