Có cách nào dễ dàng để ghi nhật ký tất cả hoạt động mà shell script không?


18

Có cách nào dễ dàng để ghi nhật ký tất cả hoạt động xảy ra từ tập lệnh shell vào tập tin không?

Tôi có một kịch bản. Nó xuất ra những thứ như "hướng dẫn" tiếng vang, cũng như đầu ra chương trình khác. Tôi biết các lệnh:

command | tee -a "$log_file"

command >> logifle.log

Những gì tôi đang hỏi là liệu có một tham số shell để ghi nhật ký, hoặc một lệnh set tôi có thể sử dụng hoặc một cái gì đó tương tự. Tôi không nhất thiết muốn thêm hàng tá chuyển hướng hoặc tee vào các tệp nếu tôi không phải làm vậy. Tôi vẫn muốn nhận đầu ra tiêu chuẩn - Tôi cũng chỉ muốn nó được ghi lại.: Wq


5
LOL ,: wq như tôi đã ở vim '
j0h

1
tôi suy nghĩ rằng hầu hết mọi người dường như làm điều đó thay vì: x
lỗi và phục hồi Monica

Câu trả lời:


18

nếu bạn thường chạy tập lệnh của mình foo.sh, hãy thử chạy tập lệnh đó (giả sử đó là tập lệnh bash) với bash -x foo.sh. Nếu bạn muốn mọi thứ được chuyển hướng đến tập tin, hãy thử bash -x foo.sh > file.log 2>&1(lưu ý tôi cũng đang chuyển hướng stderr, hãy xóa 2>&1nếu bạn không muốn điều này). Nếu bạn cũng muốn xem những gì đang xảy ra , bash -x foo.sh 2>&1 | tee log.file.


20

Có một cách rất dễ dàng và tiện dụng:

Sử dụng scriptđể tạo bản thảo của phiên cuối

  1. Bắt đầu lệnh script

    Nếu đối số fileđược đưa ra, ví dụ script ~/tmp/output, scriptlưu đoạn hội thoại trong tệp này. Nếu không có tên tệp nào được đưa ra, đoạn hội thoại sẽ được lưu trong tệptypescript

  2. Bắt đầu kịch bản của bạn hoặc những gì bạn muốn bắt đầu

  3. Nếu tập lệnh của bạn kết thúc, dừng scriptqua Ctrl-D

  4. Kiểm tra đầu ra trong tệp đầu ra mặc định typescript


Để bắt đầu lệnh của bạn trong một bước với script, sử dụng tham số-c

-c COMMAND
    Run the COMMAND rather than an interactive 
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

Việc sử dụng scriptbên trong tập lệnh của bạn không có ý nghĩa gì vì tạo scriptra trình bao hoặc bắt đầu một trình bao mới.

Nếu biến SHELL tồn tại, shell được phân tách bởi script sẽ là shell đó. Nếu SHELL không được đặt, vỏ Bourne được giả sử. (Hầu hết các shell đặt biến này tự động).


4
@Fabby Tôi thích câu trả lời của tôi, nhưng tôi không thấy điều nhỏ bé nào màu xám;)
AB

Tôi sử dụng script logfilename, vì vậy tôi có thể chọn nó.
ví von

Tôi có thể gọi "script" từ chương trình shell của mình không?
j0h

1
Điều này không có ý nghĩa, xem câu trả lời cải thiện của tôi.
AB

1
+1. Cảm ơn câu trả lời này :-) scriptcũng hữu ích cho việc theo dõi thông qua fifo. Từ man script: "Kết -f, --flushquả đầu ra sau mỗi lần ghi. Điều này rất tốt cho hoạt động từ xa: một người làm mkfifo foo; script -f foovà một người khác có thể giám sát thời gian thực những gì đang được thực hiện bằng cách sử dụng cat foo". Nó cũng có thể được sử dụng để giám sát khi một chương trình đang chờ đầu vào hoặc được thực hiện chẳng hạn bằng cách theo dõi dấu thời gian của fifo.
sudodus
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.