bash: thiết lập nhật ký -x thành tập tin


18

Tôi có một kịch bản shell set -xđể có đầu ra dài dòng / gỡ lỗi:

#!/bin/bash

set -x
command1
command2
...

Đầu ra trông như thế này:

+ command1
whatever output from command1
+ command2
whatever output from command2

Vấn đề của tôi là, sản lượng vỏ (do set -x) đi vào stderr, trộn với đầu ra của các lệnh ( command1, command2, ...). Tôi sẽ rất vui khi có đầu ra "bình thường" trên màn hình (như tập lệnh sẽ chạy mà không có set -x) và đầu ra "thêm" của bash riêng biệt trong một tệp.

Vì vậy, tôi muốn có cái này trên màn hình:

whatever output from command1
whatever output from command2

và điều này trong một tệp nhật ký:

+ command1
+ command2

(cũng tốt nếu tệp nhật ký có mọi thứ với nhau)

Các set -x 2> filerõ ràng doens't mất tác dụng đúng, bởi vì nó không phải là đầu ra của lệnh set, nhưng nó thay đổi hành vi của bash.

Việc sử dụng bash 2> filecho toàn bộ tập lệnh cũng không thực hiện đúng, vì nó cũng chuyển hướng stderr của mọi lệnh chạy trong shell này, vì vậy tôi không thấy thông báo lỗi của các lệnh.


2
Google-fu của tôi dường như rất mạnh vào sáng nay: Gửi đầu ra bash -x đến logfile mà không
xen

Câu trả lời:


20

Dựa trên câu trả lời ServerFault này Gửi đầu ra bash -x đến logfile mà khôngBASH_XTRACEFD xen kẽ đầu ra tiêu chuẩn , các phiên bản bash hiện đại bao gồm một đặc biệt để chỉ định một mô tả tệp thay thế cho đầu ra củaset -x

Vì vậy, ví dụ bạn có thể làm

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

để gửi đầu ra của set -xtệp logfiletrong khi duy trì luồng đầu ra tiêu chuẩn thông thường và luồng lỗi chuẩn cho các lệnh sau.

Lưu ý việc sử dụng fd 19 là tùy ý - nó chỉ cần là một mô tả có sẵn (tức là không phải 0, 1, 2 hoặc một số khác mà bạn đã phân bổ).


Nó thực sự lưu riêng biệt nhật ký theo dõi bash, tuy nhiên, thật khó để đọc 2 đầu ra (stdout + stderr trên màn hình và theo dõi bash trong các tệp nhật ký) vì chúng hoàn toàn không đồng bộ. Xem giải pháp những gì tôi vừa đăng .
tái lập

4

Sau hơn một năm, tôi đã tìm thấy giải pháp phù hợp để có cả đầu ra "bình thường" (stdout + stderr - bash track) trên màn hình và tất cả cùng nhau (stdout + stderr + bash track) trong một tệp (bash.log) :

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2

Đó chỉ là sự kết hợp giữa câu trả lời của Steeldo và câu trả lời này .
jarno

3

Steeldo đã cho bạn một cách tiếp cận. Ngoài ra, bạn có thể chỉ cần chuyển hướng STDERR sang một tệp:

script.sh 2> logfile

Tuy nhiên, điều đó có nghĩa là cả đầu ra được tạo bởi set -xtùy chọn và bất kỳ thông báo lỗi nào khác được tạo sẽ đi đến tệp. Giải pháp của Steeldo sẽ chỉ chuyển hướng set -xđầu ra có thể là những gì bạn muốn.


"... cả đầu ra được tạo bởi tùy chọn set -x và bất kỳ thông báo lỗi nào khác được tạo sẽ chuyển đến tệp." Và đó là lý do tại sao nó không hoạt động với tôi. Vấn đề chính của tôi là, tôi không dễ dàng nhìn thấy "lỗi thực sự", bởi vì tất cả đầu ra bash này đều đi vào thiết bị lỗi chuẩn. Chuyển hướng các thông báo lỗi lệnh cũng sẽ ẩn cho tôi "lỗi thực sự" theo một cách khác.
tái lập

@redseven Tôi sợ những gì bạn yêu cầu không rõ ràng lắm. Bạn có thể chỉnh sửa câu hỏi của bạn và làm rõ? Cố gắng tránh sử dụng thuật ngữ "đầu ra" cho bất cứ điều gì sẽ không xuất hiện. Bạn có muốn tách i) đầu ra bình thường; ii) có lỗi nào do lệnh của bạn và iii) đặt -x không? Câu trả lời của Steeldo không đủ rồi sao? Nếu không, hãy cho chúng tôi xem một tập lệnh đơn giản mà chúng tôi có thể sao chép và cho chúng tôi biết bạn muốn nó hoạt động như thế nào.
terdon

@steel ấn đã trả lời hoàn hảo câu hỏi.
tái lập

@redseven ah, tuyệt rồi. Vì nhận xét của bạn đến rất nhiều sau đó, tôi nghĩ bạn vẫn cần một cái gì đó và tôi không thể thấy câu trả lời của Steeldo không giải quyết vấn đề của bạn như thế nào. Vui mừng vì tất cả đã được sắp xếp sau đó.
terdon
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.