Utwórz zmienną znacznika czasu w skrypcie bash

375

Próbuję utworzyć zmienną znacznika czasu w skrypcie powłoki, aby nieco ułatwić rejestrowanie. Chcę utworzyć zmienną na początku skryptu i wyświetlać bieżącą godzinę za każdym razem, gdy ją wystawiam echo $timestamp. To okazuje się trudniejsze niż myślałem. Oto kilka rzeczy, które próbowałem:

timestamp="(date +"%T")" echo jest drukowane (date +"%T")

timestamp="$(date +"%T")" echo wypisuje czas, w którym zmienna została zainicjowana.

Inne rzeczy, których próbowałem, to tylko niewielkie różnice, które nie działały lepiej. Czy ktoś wie, jak osiągnąć to, co próbuję zrobić?

Dan
źródło

Odpowiedzi:

309

Aby uzyskać bieżący znacznik czasu, a nie godzinę zdefiniowania stałej zmiennej, należy użyć funkcji, a nie zmiennej:

#!/bin/bash

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

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

Jeśli nie podoba Ci się format podany przez %Tspecyfikator, możesz połączyć inne akceptowane specyfikatory konwersji czasowej date. W przypadku GNU datepełną listę tych specyfikatorów można znaleźć w oficjalnej dokumentacji tutaj: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers

Giordano
źródło
26
W zależności od tego, jak zamierzają wykorzystać to, nadal będziesz musiał użyć podstawienia polecenia: echo "$(timestamp): something happened".
chepner
5
Jeśli chodzi o formatowanie, oto zestaw najczęściej używanych formatów: zxq9.com/archives/795
zxq9,
175
Dla mnie chciałem date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson
3
z jakiegoś powodu nie dało mi to znacznika czasu, ale aktualny czas z „:” pomiędzy.
erikbwork
7
Myślę, że wiele osób dochodzi do tego pytania, szukając sposobu na wygenerowanie uniksowego znacznika czasu (jak mam) i znaleźć odpowiedź dchakarova, która jest bardziej przydatna, chociaż ta odpowiedź lepiej odpowiada pytaniu pytającego.
vastlysuperiorman
565

Jeśli chcesz uzyskać znacznik czasu unix, musisz użyć:

timestamp=$(date +%s)

%Tda ci tylko czas; taki sam jak %H:%M:%S(przez http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ )

dchakarov
źródło
5
Ale ta zmienna po prostu zachowa wartość czasu, w którym zmienna została zainicjowana, mam rację?
lindhe
9
Wydaje mi się, że zyskuje to wiele pozytywnych opinii, ponieważ odpowiada na tytuł pytania, ale nie odpowiada na pytanie: D OP chciał za każdym razem uzyskać inny znacznik czasu, podczas gdy ten zachowa jeden dla całego skryptu.
fedorqui „SO przestań krzywdzić”
1
Przybyłem tutaj, szukając tego dokładnie. To znaczy ciąg formatu, z którego można uzyskać uniksowy znacznik czasu date. Jednak głosowałem również za „poprawną” odpowiedzią. Nie szukałem tego, ale jest to lepsza odpowiedź na pierwotne pytanie i jest też dla mnie bardzo przydatna.
ogromnie superorman
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
źródło
1
dzięki, tego właśnie chciałem: znacznika czasu jako zmiennej do ponownego użycia w moim skrypcie! Składnia powłoki jest bardzo myląca.
Poutrathor
2
+1 za dodanie części milisekundowej. To echo $(date +"%Y-%m-%dT%T.%3N%z") jednak nie mogę zmusić go do pracy w terminalu Mac. Jak zrobić to samo na komputerze Mac. Dzięki
kosgeinsky
43

Format ISO 8601 ( 2018-12-23T12:34:56) jest bardziej czytelny niż znacznik czasu UNIX. Jednak w niektórych systemach operacyjnych nie można mieć :nazw plików. Dlatego zalecam użycie czegoś takiego:

2018-12-23_12-34-56

Możesz użyć następującego polecenia, aby uzyskać znacznik czasu w tym formacie:

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

Jest to format, z którego widziałem wiele aplikacji. Kolejną miłą rzeczą jest to, że jeśli nazwy plików zaczynają się od tego, możesz sortować je alfabetycznie i byłyby sortowane według daty.

Caner
źródło
1
Dzięki, jest to świetne dla mojego skryptu kontroli wersji
Andy
1
TZ=UTC date +...może uczynić to bardziej przenośnym za pomocą znacznika czasu UTC
MichaelChirico,
17

Używam Ubuntu 14.04.

Prawidłowy sposób w moim systemie powinien być date +%s .

Wyjście date +%Tjest jak 12:25:25.

Sean Lin
źródło
15

Użyj podstawienia polecenia:

timestamp=$( date +%T )
choroba
źródło
3
Właśnie tego próbowałem i wypisuje tylko czas, w którym zmienna została zainicjowana.
Dan
10
@ dan08: Tak działają zmienne. Użyj funkcji, jeśli chcesz uzyskać dynamiczne wyjście.
choroba
11

Możesz użyć

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

To dostarcza w formacie 2014-02-01 15:12:35-05:00

`Znaki back-tick ( ) spowodują, że to, co jest między nimi, zostanie ocenione, a wynik znajdzie się w wierszu. date --helpma inne opcje.

Rachunek
źródło
1
Jeśli chodzi o godzinę, należy to wykonać bezpośrednio przed włączeniem do wyjścia ekranu lub pliku dziennika, który ma mieć wymieniony czas wyjścia.
Bill
2
jest to mniej niż idealny format znacznika czasu ze względu na miejsce na wyjściu. Pamiętaj, aby podać „$ timestamp” w użyciu, w przeciwnym razie otrzymasz dwa parametry polecenia. np. touch $timestamputworzy dwa pliki.
harschware,
8

Najnowsze wersje bashnie wymagają połączenia z programem zewnętrznym date:

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

%(...)Tużywa odpowiedniego argumentu jako znacznika czasu UNIX i formatuje go zgodnie z strftimeformatem-style między nawiasami. Argument argumentu -1odpowiada bieżącemu czasowi i kiedy nie wystąpiłaby dwuznaczność, można pominąć.

chepner
źródło
5

A dla moich kolegów Europejczyków, spróbuj użyć tego:

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

poda format formatu: „15-02-2020_19-21-58”

Wywołujesz zmienną i otrzymujesz taką reprezentację ciągu

$timestamp
Christoffer Nissen
źródło
1
Rozważ użycie w kodzie notacji kodowej.
sao
4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

srand bez wartości używa bieżącego znacznika czasu z większością implementacji Awk.

Steven Penny
źródło
Podoba mi się ten, bardzo kreatywny!
TobiV