Tôi đang cố gắng thu dọn các đoạn mã sau, mục tiêu thiết kế là ghi nhật ký tất cả đầu ra từ một tập lệnh và không nên là một trình bao bọc. Ít dòng là tốt hơn.
Tôi không quan tâm đến đầu vào của người dùng (ở giai đoạn này), các tập lệnh đích được chạy không tương tác.
Đoạn trích cần phải
- xuất ra thiết bị xuất chuẩn để đăng nhập và luôn lặp lại bảng điều khiển
- đầu ra stderr để đăng nhập và echo để gỡ lỗi iff console
- thông điệp stderr nên được thêm tiền tố vào dấu thời gian và tính hữu dụng khác
Hiện tại tôi có những điều sau đây chỉ kiểm tra theo các phiên bản bash gần đây (4.2+?) Như trong Ubuntu chính xác, nhưng hoạt động sai trên CentOS6.
DEBUG_LOG="${0##*/}.log"
# copy stdout to log always and echo to console
exec > >(tee -a ${DEBUG_LOG})
# copy stderr to log only, unless debugging is enabled
[ $DEBUG_TEST = "true" ] \
&& exec 2> >(tee -a ${DEBUG_LOG} >&2) \
|| exec 2>> ${DEBUG_LOG}
Thì đây...
# Expand escaped characters, wrap at 70 chars on spaces,
# and indent wrapped lines
msg_log() {
echo -e "$(date +%T) ${0##*/}: $1" \
| fold -w70 -s | sed '2~1s/^/ /' >&2;
}
msg_con() {
if [ "${DEBUG_TEST}" = "true" ]; then
msg_log "$1"
else
echo -e "$1" | fold -w70 -s | sed '2~1s/^/ /';
fi
}
Thay vì echo
tôi có thể gọi một trong những thủ tục tin nhắn đó, vd msg_con "hello world"
.
Ngoài ra đầu ra tập lệnh sau đó sẽ đi đến thiết bị lỗi chuẩn bằng cách đặt làm biến môi trường tại thời điểm cuộc gọi, ví dụ : DEBUG_TEST=true myscript
.
Tôi đã đọc rằng exec có thể không hoạt động trong một số shell như busybox. Có một sự kết hợp mkfifo và ngã ba tại https://stackoverflow.com/a/5200754 có chức năng tương tự nhưng tôi không muốn sử dụng ngã ba trừ khi thực sự cần thiết.
Vui lòng thích các ví dụ bash, nhưng một cái gì đó hoạt động theo sh hoặc dễ mang theo hơn sẽ tốt hơn. Có ý kiến gì không?