Yürütülen komuttan hata mesajı nasıl yakalanır?


20

Otomatik sunucu sertleştirme komut dosyası oluşturmak için görevlendirildim ve ihtiyaç duydukları bir şey, yürütülen her komutun tüm çıktısının bir raporudur. Hata iletisini bir dizenin içine kaydetmek ve bir metin dosyasına eklemek istiyorum.

Diyelim ki bu komutu çalıştırdım:

/sbin/modprobe -n -v hfsplus

Bunu makinemde çalıştırmanın çıktısı şöyle olurdu:

FATAL: Module hfsplus not found

Bu hata mesajını bir dizede nasıl saklayabilirim? Herhangi bir yardım büyük mutluluk duyacağız. Teşekkürler!


Bu komutu çalıştırmayı denedim: var = $ (/ sbin / modprobe -n -v hfsplush) Ve sonra gösteriliyor: $ var Ama yine de dize içindeki hata iletisini yakalamıyor.
Miguel Roque

Yanıtlar:


24

Hatalar komutunu yeniden yönlendirerek yapabilirsiniz:

/sbin/modprobe -n -v hfsplus 2> fileName 

senaryo olarak

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

veya

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

hata >>yerine eklemek istiyorsanız>

Emin kullanmak olun 2>&1ve 2> &1hatayı önlemek için "yakın sözdizimi hatası beklenmedik belirteç` & '"


Ben bu yaklaşımı denedim ve DOĞRUDAN metin dosyasında saklar. İçeriği kolayca biçimlendirebilmem için önce bir dize içinde saklamak istiyorum.
Miguel Roque

1
@MiguelRoque güncellemelere bakın
Networker

1
Üretimi bir HEREDOC içine koymaya çalıştım ve bu da işe yaradı. Çok teşekkürler @Networker!
Miguel Roque

1
Birisi yaptığım düzenlemeyi geri aldı, çünkü yakınımda bir "sözdizimi hatası vardı" ve arkasından> alanı kaldırdım. Bir gerekçe iyi olurdu.
Pierre.Sassoulas

Düzenlemeye çalıştım çünkü: "beklenmedik belirtecin yanında sözdizimi hatası" & 2 "hatasını önlemek için 2> & 1 değil 2> & 1 kullandığınızdan emin olun
peter_v

15

Sadece bash betiğinde dize olarak saklamak için:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

Komut yürütüldüğünde iletileri göreceğiniz için bu biraz daha iyi olabilir:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

1
Komut yerine koymak için her zaman backticks yerine $ (command) kullanın. Daha iyi :)
Sree

Daha iyi olduğunu biliyorum ($ () kullanarak daha az sorun yaşadım), ama neden?
KolonUK

4

Böyle bir hatayı yakaladım

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

Kaynak başarısız olursa, hatayı yakalayıp günlüğe kaydedeceğim. log_warn sadece basit bir işlevdir.

BTW, benim bu kullanmak dotfiles



2

Daha yeni bash sürümleri (Ie bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

0

Bir değişkendeki hata iletisini döndürmek için;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

echo $error
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.