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