🐧 Как использовать текущую дату в скрипте Bash

Добавляем дату в скрипт

by itisgood

Можно использовать команду date для получения текущего времени

Использование команды date

Создайте пример сообщения лога:

echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S"): log message"
2024-03-31 17:52:48: log message

Создайте образец файла резервной копии.

current_datetime="$(TZ=UTC date +%Y-%m-%d_%H%M%S)"
tar --create --gzip --file "ssh-${current_datetime}.tar.gz" .ssh
find ./ -maxdepth 1 -name "ssh-*.tar.gz"
./ssh-2024-03-31_165128.tar.gz

Использование форматирования, подобного strftime

Создайте пример сообщения лога:

TZ=UTC printf "%(%Y-%m-%d %H:%M:%S)T: %s\n" "-1" "log message"
2024-03-31 18:15:43: log message

Создайте образец файла резервной копии.

TZ=UTC printf -v current_datetime "%(%Y-%m-%d_%H%M%S)T" "-1"
tar --create --gzip --file "ssh-${current_datetime}.tar.gz" .ssh
find ./ -maxdepth 1 -name "ssh-*.tar.gz"
./ssh-2024-03-31_181740.tar.gz

Этот метод намного проще, особенно в первом случае.

Дополнительные примечания

В этом нет ничего нового, поскольку данная функциональность существует уже более десяти лет, но используется редко.

Как правило, производительность не вызывает проблем, поскольку эти команды выполняются только один или несколько раз во время выполнения сценария оболочки.

Однако если вам нужно выполнить эти операции тысячи раз, то использование форматирования, подобного strftime, может быть более эффективным, чем вызов команды date в подоболочке.

Выполнение команды date в подоболочке.

$ /usr/bin/time --verbose bash -c 'for i in $(seq 1 10000); do echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S"): log message" >/dev/null; done'
Command being timed: "bash -c for i in $(seq 1 10000); do echo "$(TZ=UTC date +"%Y-%m-%d %H:%M:%S"): log message" >/dev/null; done"
User time (seconds): 6.40
System time (seconds): 1.83
Percent of CPU this job got: 101%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:08.08
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 4408
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 1538620
Voluntary context switches: 30024
Involuntary context switches: 3358
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Выполнение форматирования типа strftime.

$ /usr/bin/time --verbose bash -c 'for i in $(seq 1 10000); do TZ=UTC printf "%(%Y-%m-%d %H:%M:%S)T: %s\n" "-1" "log message" >/dev/null; done'
Command being timed: "bash -c for i in $(seq 1 10000); do TZ=UTC printf "%(%Y-%m-%d %H:%M:%S)T: %s\n" "-1" "log message" >/dev/null; done"
User time (seconds): 0.23
System time (seconds): 0.07
Percent of CPU this job got: 99%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.31
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 4556
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 543
Voluntary context switches: 3
Involuntary context switches: 31
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Разница существенна, но обычно она минимальна, поскольку обычно выполняется всего один раз в начале скрипта  а не десять тысяч раз.

 

You may also like

Leave a Comment