Повідомлення Райана дає цікаву ідею, однак воно провалюється в кількох аспектах. Під час тестування tail -f /var/log/syslog | xargs -L 1 echo $(date +'[%Y-%m-%d %H:%M:%S]') $1 я помітив, що часова марка залишається такою ж, навіть якщо stdoutз’являється пізніше з різницею в секундах один від одного. Розглянемо цей вихід:
[2016-07-14 01:44:25] Jul 14 01:44:32 eagle dhclient[16091]: DHCPREQUEST of 192.168.0.78 on wlan7 to 255.255.255.255 port 67 (xid=0x411b8c21)
[2016-07-14 01:44:25] Jul 14 01:44:34 eagle avahi-daemon[740]: Joining mDNS multicast group on interface wlan7.IPv6 with address fe80::d253:49ff:fe3d:53fd.
[2016-07-14 01:44:25] Jul 14 01:44:34 eagle avahi-daemon[740]: New relevant interface wlan7.IPv6 for mDNS.
Моє запропоноване рішення є подібним, однак забезпечує належне відмітку часу і використовує дещо більш портативний printf, ніжecho
| xargs -L 1 bash -c 'printf "[%s] %s\n" "$(date +%Y-%m-%d\ %H:%M:%S )" "$*" ' bash
Чому bash -c '...' bash? Тому що через -cопцію, перший аргумент присвоюється $0і не відображатиметься у висновку. Зверніться до сторінки керівництва вашої оболонки для правильного опису-c
Тестування цього рішення tail -f /var/log/syslogта (як ви, напевно, могли здогадатися), відключення та підключення до мого Wi-Fi, показало належну мітку часу, яку надають dateі syslogповідомлення, і повідомлення
Баш може бути замінений будь-якою оболонкою, що нагадує бурш, може бути виконана з будь-якою kshабо dash, принаймні, з тими, що мають -cможливість.
Потенційні питання:
Рішення вимагає наявності xargs, яке доступне на POSIX-сумісних системах, тому більшість Unix-подібних систем слід охоплювати. Очевидно, не буде працювати, якщо ваша система не сумісна з POSIX або її немаєGNU findutils