Criar variável de carimbo de data / hora no script bash

375

Estou tentando criar uma variável de carimbo de data / hora em um script de shell para facilitar um pouco o log. Quero criar a variável no início do script e imprimir a hora atual sempre que eu emitir echo $timestamp. Está provando ser mais difícil do que eu pensava. Aqui estão algumas coisas que eu tentei:

timestamp="(date +"%T")" o eco é impresso (date +"%T")

timestamp="$(date +"%T")" eco indica a hora em que a variável foi inicializada.

Outras coisas que tentei são apenas pequenas variações que não funcionaram melhor. Alguém sabe como realizar o que estou tentando fazer?

Dan
fonte

Respostas:

309

Para obter o registro de data e hora atual e não o horário em que uma variável fixa é definida, o truque é usar uma função e não uma variável:

#!/bin/bash

# Define a timestamp function
timestamp() {
  date +"%T"
}

# do something...
timestamp # print timestamp
# do something else...
timestamp # print another timestamp
# continue...

Se você não gostar do formato fornecido pelo %Tespecificador, poderá combinar os outros especificadores de conversão de tempo aceitos por date. Para o GNU date, você pode encontrar a lista completa desses especificadores na documentação oficial aqui: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

Giordano
fonte
26
Dependendo de como você pretende usar isso, você ainda vai precisar usar substituição de comando: echo "$(timestamp): something happened".
chepner
5
Como para a formatação, aqui é um conjunto seco de corte e da maioria dos formatos de frequentes: zxq9.com/archives/795
zxq9
175
Para mim, eu queria date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson
3
por algum motivo, isso não me deu o carimbo de data e hora, mas o horário atual com ":" no meio.
precisa saber é o seguinte
7
Eu acho que muitas pessoas chegam a essa pergunta procurando uma maneira de gerar um carimbo de data / hora unix (como eu) e considero a resposta de dchakarov mais útil, embora essa resposta atenda melhor à pergunta do solicitante.
vastlysuperiorman
565

Se você deseja obter o timestamp unix, precisará usar:

timestamp=$(date +%s)

%Tlhe dará o tempo certo; igual a %H:%M:%S(via http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )

dchakarov
fonte
5
Mas essa variável manterá apenas o valor do momento em que a variável foi iniciada, estou certo?
Lindhe
9
Eu acho que isso está recebendo muitas votações porque responde ao título da pergunta, mas não está respondendo ao corpo da pergunta: o D OP queria obter um timestamp diferente a cada vez, enquanto isso armazenará um para todo o script.
fedorqui 'SO stop harming'
11
Eu vim aqui procurando exatamente isso. Ou seja, a string de formato adequada para obter um carimbo de data / hora unix date. No entanto, também votei na resposta "correta". Eu não estava procurando por isso, mas é uma resposta melhor para a pergunta original e também é realmente útil para mim.
22419 Marsh
69
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too
Girdhar Singh Rathore
fonte
11
obrigado, era o que eu queria: um registro de data e hora como variável para reutilizar no meu script! A sintaxe do shell é tão confusa.
Poutrathor
2
+1 para adicionar a parte de milissegundos. Este echo $(date +"%Y-%m-%dT%T.%3N%z") No entanto eu não posso fazê-lo funcionar em um terminal Mac. Como fazer o mesmo no Mac. Graças
kosgeinsky
43

O formato ISO 8601 ( 2018-12-23T12:34:56) é mais legível que o registro de data e hora do UNIX. No entanto, em alguns sistemas operacionais, você não pode ter :os nomes dos arquivos. Portanto, eu recomendo usar algo assim:

2018-12-23_12-34-56

Você pode usar o seguinte comando para obter o registro de data e hora neste formato:

TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`

Este é o formato que eu já vi muitos aplicativos usarem. Outra coisa interessante é que, se os nomes dos arquivos começarem com isso, você poderá classificá-los em ordem alfabética e eles serão classificados por data.

Caner
fonte
11
Graças isso é ótimo para o meu script controles de versão
Andy
11
TZ=UTC date +...pode tornar isso mais portátil usando UTC timestamp
MichaelChirico
17

Estou usando o ubuntu 14.04.

A maneira correta no meu sistema deve ser date +%s.

A saída de date +%Té como 12:25:25.

Sean Lin
fonte
15

Use substituição de comando:

timestamp=$( date +%T )
choroba
fonte
3
Isto é o que eu já tentei e só imprime o momento em que a variável foi inicializada.
Dan
10
@ dan08: É assim que as variáveis ​​funcionam. Use uma função se desejar saída dinâmica.
choroba 12/06
11

Você pode usar

timestamp=`date --rfc-3339=seconds`

Isso oferece no formato 2014-02-01 15:12:35-05:00

Os caracteres back-tick ( `) farão com que o que está entre eles seja avaliado e tenha o resultado incluído na linha. date --helptem outras opções.

Conta
fonte
11
Quanto à hora, isso deve ser executado imediatamente antes da inclusão na saída da tela ou em um arquivo de log destinado a listar a hora da saída.
Bill
2
esse formato é menor que o ideal para um registro de data e hora devido ao espaço na saída. Certifique-se de citar "$ timestamp" em uso ou você receberá dois parâmetros para o comando. por exemplo touch $timestamp, produzirá dois arquivos.
harschware
8

Versões recentes de bashnão requerem chamada para o programa externo date:

printf -v timestamp '%(%T)T'

%(...)Tusa o argumento correspondente como um registro de data e hora do UNIX e o formata de acordo com o strftimeformato -style entre parênteses. Um argumento -1corresponde ao horário atual e, quando nenhuma ambiguidade ocorreria, pode ser omitido.

chepner
fonte
5

E para os meus colegas europeus, tente usar o seguinte:

timestamp=$(date +%d-%m-%Y_%H-%M-%S)

fornecerá um formato do formato: "15-02-2020_19-21-58"

Você chama a variável e obtém a representação de string como esta

$timestamp
Christoffer Nissen
fonte
11
Por favor, considere usar a notação de código para o seu código.
15/02
4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand sem um valor usa o timestamp atual com a maioria das implementações do Awk.

Steven Penny
fonte
Eu gosto deste, muito criativo!
TobiV