Bagaimana cara menangkap pesan kesalahan dari perintah yang dijalankan?

20

Saya ditugaskan untuk membuat skrip pengerasan server otomatis dan satu hal yang mereka butuhkan adalah laporan dari semua output dari setiap perintah yang dieksekusi. Saya ingin menyimpan pesan kesalahan di dalam string dan menambahkannya dalam file teks.

Katakanlah saya menjalankan perintah ini:

/sbin/modprobe -n -v hfsplus

Output dari menjalankan ini di mesin saya adalah:

FATAL: Module hfsplus not found

Bagaimana saya bisa menyimpan pesan kesalahan itu di dalam sebuah string? Bantuan apa pun akan sangat dihargai. Terima kasih!

Miguel Roque
sumber
Saya mencoba menjalankan perintah ini: var = $ (/ sbin / modprobe -n -v hfsplush) Dan kemudian menampilkannya: $ var Tetapi masih tidak menangkap pesan kesalahan di dalam string.
Miguel Roque

Jawaban:

23

Anda dapat melakukannya dengan mengarahkan ulang perintah kesalahan:

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

sebagai naskah

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

atau

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

jika Anda ingin menambahkan penggunaan kesalahan, >>bukan>

Pastikan untuk menggunakan 2>&1dan tidak 2> &1menghindari kesalahan "kesalahan sintaksis dekat token yang tak terduga` & '"

Networker
sumber
Saya sudah mencoba pendekatan itu dan menyimpannya secara LANGSUNG di file teks. Saya ingin menyimpannya di dalam string terlebih dahulu sehingga saya dapat memformat konten dengan mudah.
Miguel Roque
1
@MiguelRoque lihat pembaruan
Networker
1
Saya mencoba memasukkan output ke dalam HEREDOC dan berhasil juga. Terima kasih banyak @Networker!
Miguel Roque
1
Seseorang mengembalikan hasil edit yang saya lakukan, karena saya memiliki "kesalahan sintaksis di dekat &" dan menghapus spasi setelah>. Pembenaran akan menyenangkan.
Pierre.Sassoulas
Saya mencoba mengedit karena: Pastikan untuk menggunakan 2> & 1 dan bukan 2> & 1 untuk menghindari kesalahan "kesalahan sintaksis dekat token tak
terduga`
15

Cukup untuk menyimpan sebagai string dalam skrip bash:

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

Ini bisa sedikit lebih baik karena Anda akan melihat pesan ketika perintah dijalankan:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP
grafit
sumber
1
Selalu gunakan $ (command) alih-alih backticks untuk substitusi perintah. Lebih baik :)
Sree
Saya tahu ini lebih baik (saya memiliki lebih sedikit masalah dalam menggunakan $ ()), tetapi mengapa begitu?
KolonUK
4

Saya menangkap kesalahan seperti ini

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

jika sumber gagal, saya akan menangkap kesalahan dan mencatatnya.log_warn hanyalah fungsi sederhana.

BTW, saya menggunakan ini di dotfiles saya

Wener
sumber
2

Untuk menambahkan penggunaan file /sbin/modprobe -n -v hfsplus 2>> filename

harish.venkat
sumber
2

Versi bash yang lebih baru (Yaitu bash 4.1+):

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

Untuk mengembalikan pesan kesalahan dalam suatu variabel, cukup;

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

echo $error
Jonathan
sumber