Bash komut dosyası - dönüş değeri 0 olana kadar döngü


25

Komut dosyamda bir şey bulmam gerekiyor, ancak bazen tüm veriler kopyalanmadan önce bitiyor ve bu sayının başarısız olmasına neden oluyor. "Engelleyen" bir miktar yapmanın bir yolunu aradım ama hiçbir şey bulamadım. Böylece, ayrılmayacak kadar döngü için bir senaryo yazmaya çalıştım, ama işe yaramadı.

while [ `sudo umount mount` ]
do
    sleep 0.1
done
rmdir mount

Çalıştır çıktıları:

umount: /home/evantandersen/mount: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
rmdir: failed to remove `mount': Device or resource busy

Dönüş değeri sudo umount mount0 olana kadar döngü yapmaz mı, yani başarıyla kaldırıldı mı?

Yanıtlar:


59

[Komut koşullu ifadeleri değerlendirmektir. Burada faydası yok.

Çünkü umountstandart çıktısında herhangi bir şey çıkarmaz (hatalar stderr'e gider), `sudo umount mount`hiçbir şeye genişlemez.

Yani şöyle:

while [ ]
do
  sleep 0.1
done

[Komut, yanında herhangi bir argüman geçmedi zaman [ve ]döner sahte döngü girmeyecektir (sıfır olmayan bir çıkış durumu), bu yüzden.

umountStdout'taki hatalarını çıkarmış olsanız bile , [komutu kullanmak mantıklı olmazdı, çünkü bu çıktıdan çıkan kelimeler hiçbir zaman geçerli bir koşullu ifade oluşturmazdı.

İşte istiyorsun:

until sudo umount mount
do
  sleep 0.1
done

Başka bir deyişle, sudo / umount [komutunun değil çıkış durumunu kontrol etmek istiyorsunuz .

Eğer umountstderr üzerinde herhangi bir hata veya uyarı çıktısı olup olmadığını kontrol etmek istiyorsanız , orası [yararlı olabilir. -n "some-string"Tarafından tanınan şartlı ifadedir [olmadığını test etmek için komutun "some-string", boş veya bir şey değil gibi pek:

while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
  sleep 0.1
done

Ancak hata veya uyarı mesajlarının varlığını aramak genellikle kötü bir fikirdir. umount Komut çok daha güvenilirdir onun çıkış kodu ile başarılı olsun veya olmasın söyler. Başarılı olabilir ve hala bazı uyarı mesajları verebilir. Başarısız olabilir ve bir hataya neden olmaz (öldürüldüğü gibi).

Bu özel durumda, umountdizin takılı olmadığından ve bu durumda sonsuza kadar döngü oluşturduğunuzdan başarısız olabileceğine dikkat edin , böylece şöyle bir başka yaklaşım deneyebilirsiniz:

while mountpoint -q mount && ! sudo umount mount; do
  sleep 0.1
done

Veya "mount" birkaç kez monte edilmişse ve hepsini çıkarmak istiyorsanız:

while mountpoint -q mount; do
  sudo umount mount || sleep 0.1
done

Çalışır, harika!
charliehorse55

1
Kullanarak arasındaki farkı açıklamak için + 1 [, [[ya da. Tipik insan sayfaları, GNU ve / veya TLDP örnekleri gibi detaylarla ilgili bash koşullanmaları hakkında bilgi istiyorum
renoirb

5

yeniden kullanılabilir işlev ve 'n' saniye içinde zaman aşımı

_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
}

uyumana gerek yok


1
[[...]]olduğu ksh/ bash/ zsh, her biri belirli, $SECONDSYapabileceğin yüzden, özel değişken:SECONDS=0; until umount... || ((SECONDS > $1)); do..
Stéphane Chazelas

mount remount,roIntenso Micro Line USB bellek çubuğuyla 2009 yılındaki bir mips cihazındaki bir komutun tamamlanması 23 hatta 30+ saniye sürebilir .
Pro Yedekleme
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.