Tôi hiện đang sử dụng sau đây để nắm bắt tất cả mọi thứ mà đi đến nhà ga và ném nó vào một tập tin logbash tee remove màu
exec 4<&1 5<&2 1>&2>&>(tee -a $LOG_FILE)
tuy nhiên, tôi không muốn mã màu thoát/lộn xộn đi vào tệp nhật ký. vì vậy tôi có một cái gì đó như thế này mà sorta làm việc
exec 4<&1 5<&2 1>&2>&>(
while read -u 0; do
#to terminal
echo "$REPLY"
#to log file (color removed)
echo "$REPLY" | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' >> $LOG_FILE
done
unset REPLY #tidy
)
trừ read
chờ đợi vận chuyển trở lại mà không phải là lý tưởng đối với một số phần của kịch bản (ví dụ echo -n "..."
hoặc printf
mà không \n
).
Follow-up để trả lời Jonathan Leffler của:
Với ví dụ kịch bản test.sh
:
#!/bin/bash
LOG_FILE="./test.log"
echo -n >$LOG_FILE
exec 4<&1 5<&2 1>&2>&>(tee -a >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > $LOG_FILE))
##### ##### #####
# Main
echo "starting execution"
printf "\n\n"
echo "color test:"
echo -e "\033[0;31mhello \033[0;32mworld\033[0m!"
printf "\n\n"
echo -e "\033[0;36mEnvironment:\033[0m\n foo: cat\n bar: dog\n your wife: hot\n fix: A/C"
echo -n "Before we get started. Is the above information correct? "
read YES
echo -e "\n[READ] $YES" >> $LOG_FILE
YES=$(echo "$YES" | sed 's/^\s*//;s/\s*$//')
test ! "$(echo "$YES" | grep -iE '^y(es)?$')" && echo -e "\nExiting... :(" && exit
printf "\n\n"
#...some hundreds of lines of code later...
echo "Done!"
##### ##### #####
# End
exec 1<&4 4>&- 2<&5 5>&-
echo "Log File: $LOG_FILE"
Sản lượng đến thiết bị đầu cuối được như mong đợi và không có mã màu thoát/lộn xộn trong tệp nhật ký như mong muốn. Tuy nhiên, khi kiểm tra
test.log
, tôi không thấy số[READ] ...
(xem dòng 21 củatest.sh
).Tệp nhật ký [của tập lệnh bash thực tế] chứa dòng
Log File: ...
ở cuối của nó ngay cả sau khi đóng các fds 4 và 5. Tôi đã có thể giải quyết vấn đề bằng cách đặt một sốsleep 1
trước sốexec
thứ hai - Tôi cho rằng có một điều kiện chủng tộc hoặc shenanigans fd để đổ lỗi cho nó. Thật không may cho các bạn, tôi không thể tái sản xuất vấn đề này vớitest.sh
nhưng tôi muốn được quan tâm đến bất kỳ đầu cơ bất cứ ai có thể có.
Lưu ý rằng \ e [... m mã cụ thể cho VT100/VT200/etc. và có thể không phải là những chương trình thực sự được xuất bản bởi chương trình trên một loại $ TERM khác. –