Назад | Перейти на главную страницу

Эхо каждой команды сценария оболочки с меткой времени

set -x или set -v печатает каждую выполненную команду.

Как мне напечатать команду с указанием времени, когда команда начала выполняться?

в Bash выполнение кода после каждой команды может быть достигнуто с помощью встроенной функции «trap» и уровня «DEBUG».

в bash do: help trap или обратитесь к странице руководства bash и найдите раздел trap

пример:

trap 'date' DEBUG

Это будет выполнять команду "date" juste после каждой команды.

Конечно, вы можете отформатировать метку времени по своему усмотрению, см. Справочную страницу «Дата».

Если вы хотите удалить новую строку, чтобы метка времени отображалась перед следующей командой, вы можете сделать:

trap 'echo -n $(date)' DEBUG

И чтобы прекратить это:

trap '' DEBUG

Вы можете комбинировать с "set -x" / "set + x"

В Bash вы можете использовать PS4 - который используется set -x для префикса вывода трассировки.

PS4='+ $(date "+%s.%N")\011 '
set -x
...

\ 011 - символ горизонтальной табуляции

Я ни в коем случае не говорю, что это идеальное решение, но я думаю, что оно в основном выполняет то, что вам нужно. Просто оберните основной сценарий в функцию и выделите отдельную функцию для вызова времени. Я уверен, что это можно было бы значительно улучшить, чтобы получить точный желаемый результат, но вот что я придумал:

#!/bin/bash

tstamp() { date +[%T:%N]; }

yourscript() {
  set -x
  echo hello
  sleep 1
  echo this
  sleep 2
  echo is
  sleep 3
  echo an
  echo example
}

yourscript | while read line; do echo -e "$(tstamp)\t$line"; done

Приведенный выше сценарий выводит следующее:

+ echo hello
+ sleep 1
[16:17:33:344851100]    hello
+ echo this
+ sleep 2
[16:17:34:352269700]    this
+ echo is
+ sleep 3
[16:17:36:380810900]    is
+ echo an
+ echo example
[16:17:39:392033300]    an
[16:17:39:414361400]    example