[
Komenda jest ocena wyrażeń warunkowych. Tu nie ma sensu.
Ponieważ umount
nie wypisuje niczego na standardowym wyjściu (błędy idą do stderr), `sudo umount mount`
rozwija się do zera.
To jest jak:
while [ ]
do
sleep 0.1
done
[
Poleceń, gdy nie przeszedł obok żadnego argumentu [
i ]
zwraca fałsz (exit status non-zero), więc nie wejdzie w pętlę.
Nawet gdyby umount
wypisał swoje błędy na standardowe wyjście, użycie [
polecenia nie miałoby sensu, ponieważ słowa wynikające z tego wyjścia nigdy nie tworzyłyby poprawnego wyrażenia warunkowego.
Tutaj chcesz:
until sudo umount mount
do
sleep 0.1
done
Oznacza to, że chcesz sprawdzić status wyjścia sudo / umount, a nie [
polecenia.
Jeśli chcesz sprawdzić, czy umount
wypisuje jakiś błąd lub ostrzeżenie na swoim stderr, to [
może być przydatne. Jest -n "some-string"
to wyrażenie warunkowe rozpoznawane przez [
polecenie sprawdzające, czy "some-string"
jest puste, czy nie, więc coś w stylu:
while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
sleep 0.1
done
Ale szukanie komunikatów o błędach lub ostrzeżeniach jest ogólnie złym pomysłem. umount
Komenda mówi nam, czy nie powiedzie się z jego kod wyjścia, który jest dużo bardziej niezawodny. Może się udać i nadal wyświetla komunikat ostrzegawczy. Może się nie powieść i nie wygenerować błędu (np. Kiedy zostanie zabity).
W tym konkretnym przypadku zwróć uwagę, że umount
może się to nie powieść, ponieważ katalog nie jest podłączony, w takim przypadku zapętlasz się na zawsze, abyś mógł wypróbować inne podejście, takie jak:
while mountpoint -q mount && ! sudo umount mount; do
sleep 0.1
done
Lub jeśli „mount” może być zamontowany kilka razy i chcesz je wszystkie odmontować:
while mountpoint -q mount; do
sudo umount mount || sleep 0.1
done
[
,[[
czy nie. Chciałbym, aby typowe strony podręcznika, przykłady GNU i / lub TLDP na temat warunkowychfunkcja wielokrotnego użytku i upłynie limit czasu za 'n' sekund
nie trzeba spać
źródło
[[...]]
jestksh
/bash
/zsh
specific, z których wszystkie mają$SECONDS
specjalną zmienną, więc możesz zrobić:SECONDS=0; until umount... || ((SECONDS > $1)); do..
mount remount,ro
polecenia na urządzeniu mips anno 2009 z pamięcią USB Intenso Micro Line może potrwać 23, a nawet ponad 30 sekund .