Làm thế nào để nắm bắt thông báo lỗi từ lệnh thực thi?


20

Tôi được giao nhiệm vụ tạo ra một kịch bản cứng máy chủ tự động và một điều họ cần là một báo cáo về tất cả đầu ra của mỗi lệnh được thực thi. Tôi muốn lưu trữ thông báo lỗi bên trong một chuỗi và nối nó vào một tệp văn bản.

Hãy nói rằng tôi đã chạy lệnh này:

/sbin/modprobe -n -v hfsplus

Đầu ra của việc chạy này trong máy của tôi sẽ là:

FATAL: Module hfsplus not found

Làm thế nào tôi có thể lưu trữ thông báo lỗi đó trong một chuỗi? Mọi sự trợ giúp sẽ rất được trân trọng. Cảm ơn!


Tôi đã thử chạy lệnh này: var = $ (/ sbin / modprobe -n -v hfsplush) Và sau đó hiển thị nó: $ var Nhưng nó vẫn không chụp được thông báo lỗi bên trong chuỗi.
Miguel Roque

Câu trả lời:


23

bạn có thể làm điều đó bằng cách chuyển hướng lệnh lỗi:

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

như một kịch bản

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

hoặc là

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

nếu bạn muốn nối thêm lỗi sử dụng >> thay vì>

Đảm bảo sử dụng 2>&1và không 2> &1để tránh lỗi "lỗi cú pháp gần mã thông báo không mong muốn` & '"


Tôi đã thử cách tiếp cận đó và nó lưu nó TRỰC TIẾP trong tệp văn bản. Tôi muốn nó lưu trữ bên trong một chuỗi đầu tiên để tôi có thể định dạng nội dung dễ dàng.
Miguel Roque

1
@MiguelRoque xem cập nhật
Networker

1
Tôi đã thử đặt đầu ra bên trong HEREDOC và nó cũng hoạt động. Cảm ơn rất nhiều @Networker!
Miguel Roque

1
Ai đó đã hoàn nguyên bản chỉnh sửa mà tôi đã thực hiện, vì tôi có "lỗi cú pháp gần &" và xóa khoảng trắng sau>. Một lời biện minh sẽ là tốt đẹp.
Pierre.Sassoulas

Tôi đã cố gắng chỉnh sửa vì: Đảm bảo sử dụng 2> & 1 chứ không phải 2> & 1 để tránh lỗi "lỗi cú pháp gần mã thông báo không mong
đợi`

15

Đơn giản chỉ cần lưu trữ dưới dạng một chuỗi trong tập lệnh bash:

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

Điều này có thể tốt hơn một chút vì bạn sẽ thấy các thông báo khi lệnh được thực thi:

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

1
Luôn sử dụng $ (lệnh) thay vì backticks để thay thế lệnh. Nó là tốt hơn :)
Sree

Tôi biết nó tốt hơn (tôi đã có ít vấn đề hơn khi sử dụng $ ()), nhưng tại sao vậy?
KolonUK

4

Tôi chụp lỗi như thế này

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

nếu nguồn không thành công, tôi sẽ ghi lại lỗi và ghi lại nó.log_warn chỉ là một hàm đơn giản.

BTW, tôi sử dụng điều này trong dotfiles của tôi


2

Để thêm vào một tập tin sử dụng /sbin/modprobe -n -v hfsplus 2>> filename


2

Các phiên bản bash mới hơn (Ie bash 4.1+):

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

0

Để trả về thông báo lỗi trong một biến, chỉ cần;

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

echo $error
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.