Điểm:3

Chụp đầu ra tập lệnh để thêm ngày giờ vào đầu ra trong thời gian thực

lá cờ cn

Tôi đang tìm cách nắm bắt đầu ra của quá trình thực thi tập lệnh shell trong thời gian thực để làm phong phú thêm thông tin cung cấp ngày và giờ.

Để minh họa, tôi có ví dụ một tập lệnh thuộc loại này mà tôi không được sửa đổi:

#!/bin/bash
cho tôi trong 2 3 1
làm
  echo "Đang chờ $i giây..."
  ngủ đi
xong

Kịch bản tạo ra đầu ra sau:

Đợi 2 giây...
Đợi 3 giây...
Đợi 1 giây...

Tôi đang cố gắng tạo đầu ra của loại:

2021-06-16 11:44:48 [INFO] Đợi 2 giây ...
2021-06-16 11:44:50 [INFO] Chờ 3 giây ...
2021-06-16 11:44:53 [INFO] Đợi 1 giây ...

Tôi sử dụng các hàm shell sau để định dạng trong tập lệnh chạy tập lệnh ban đầu của mình:

nhật ký chức năng {
   echo `date +%Y-%m-%d" "%H:%M:%S`" $@"
   nếu [ "$LOGFILE" != "" ]
   sau đó
      echo `date +%Y-%m-%d" "%H:%M:%S`" $@" >>$LOGFILE
   fi
}

chức năng đăng nhậpf {
   nhật ký "[THÔNG TIN] $@"
}

Tôi quản lý rất tốt với vòng lặp while khi đọc để nắm bắt đầu ra của tập lệnh của mình, nhưng tôi nhận được tất cả các dòng cùng một lúc (kết thúc quá trình thực thi) và do đó, tất cả các dòng đều có cùng thời gian. Tôi cố gắng lấy các dòng mỗi khi tập lệnh tạo một dòng chứ không phải khi kết thúc quá trình thực thi.

pLumo avatar
lá cờ in
Làm thế nào để bạn gọi kịch bản ban đầu của bạn? Điều này hoạt động tốt với tôi: `./script1.sh | trong khi IFS= đọc -r l; làm loginf "$l"; xong`. Xem thêm https://serverfault.com/questions/72744/command-to-prepend-string-to-each-line
bac0n avatar
lá cờ cn
`./script.sh | ts "%Y-%m-%d %H:%M:%S [INFO]"`
raj avatar
lá cờ cn
raj
Tôi đã tạo một tập lệnh chứa hai chức năng của bạn và sau đó là đoạn mã sau: `while { read; } thực hiện đăng nhập $REPLY; xong`. Đang chạy `./script1 | ./script2` (trong đó `script1` là tập lệnh đầu tiên của bạn và `script2` là tập lệnh được đề cập ở trên) cung cấp đầu ra chính xác cho tôi, tức là. dấu thời gian khác nhau.
bac0n avatar
lá cờ cn
thực sự không cần dùng `echo`, chỉ cần dùng `f(){ date "+%Y-%m-%d %H:%M:%S [INFO] $*"; }; f một hai ba`
bac0n avatar
lá cờ cn
`f(){ printf '%(%Y-%m-%d %H:%M:%S)T [%s] %s\n' -1 THÔNG TIN "$*"; }; f một hai ba` thậm chí còn tốt hơn...
Điểm:2
lá cờ us

Các ts lệnh từ gói tiện ích hơn thực hiện chính xác những gì bạn đang tìm kiếm:

./script.sh | ts

Nó có nhiều tùy chọn khác nhau để định dạng dấu thời gian. Ví dụ,

ts '%F %T [THÔNG TIN]'

sẽ cung cấp cho bạn định dạng chính xác mà bạn sử dụng trong câu hỏi của mình.

Điểm:0
lá cờ cn
vog

Bạn có thể sử dụng ts:

./your_script.sh | ts

Tất nhiên, nếu bạn cần thứ gì đó di động hoạt động trên các hệ thống nơi ts chưa được cài đặt, bạn có thể làm điều đó một cách đơn giản trong khi vòng lặp sử dụng tích hợp đọc chỉ huy:

./your_script.sh | trong khi đọc dòng; do echo "$(date +'%Y-%m-%d %H:%M:%S') [INFO] $line"; xong

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.