Bas betiğinde zaman damgası değişkeni oluşturma


375

Günlüğü biraz daha kolay hale getirmek için bir kabuk betiğinde bir zaman damgası değişkeni oluşturmaya çalışıyorum. Komut dosyasının başında değişken oluşturmak ve her ne zaman ben yayınlamak şimdiki zaman yazdırmak istiyorum echo $timestamp. Düşündüğümden daha zor olduğunu kanıtlıyor. İşte denediğim bazı şeyler:

timestamp="(date +"%T")" yankı çıktıları (date +"%T")

timestamp="$(date +"%T")" echo, değişkenin başlatıldığı zamanı yazdırır.

Denediğim diğer şeyler, daha iyi çalışmayan küçük varyasyonlardır. Yapmaya çalıştığım şeyi nasıl başaracağını bilen var mı?

Yanıtlar:


309

Sabit bir değişkenin tanımlandığı zamanı değil, geçerli zaman damgasını almak için, hile bir değişkeni değil bir işlevi kullanmaktır :

#!/bin/bash

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

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

Belirteci tarafından verilen biçimi beğenmezseniz, %Tkabul ettiği diğer zaman dönüşümü belirleyicilerini birleştirebilirsiniz date. GNU için date, bu belirteçlerin tam listesini resmi belgelerde bulabilirsiniz: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers


26
Bunu kullanmak niyetinde nasıl bağlı olarak, yine komut ikamesi kullanmanız gerekir: echo "$(timestamp): something happened".
Chepner

5
Biçimlendirmeye gelince, burada en sık kullanılan biçimlerin kesilmiş ve kurutulmuş bir seti bulunmaktadır: zxq9.com/archives/795
zxq9

175
Benim için istedim date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson

3
bazı nedenlerden dolayı bu bana zaman damgası vermedi, ancak şu anki zamanı ":" ile aralarında verdi.
erikbwork

7
Sanırım bir çok insan bu soruya bir unix zaman damgası oluşturmanın bir yolunu arıyor (bu benim gibi) ve dchakarov'un yanıtı, bu yanıtın sorucunun sorusunu daha iyi ele almasına rağmen daha yararlı olabileceğini düşünüyorum.
vastlysuperiorman

565

Unix zaman damgası almak istiyorsanız, kullanmanız gerekir:

timestamp=$(date +%s)

%Tsize tam zamanı verecek; ile aynı %H:%M:%S( http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ aracılığıyla )


5
Ancak bu değişken, değişkenin başlatıldığı zamanın değerini tutacaktır, değil mi?
lindhe

9
Sanırım bu bir sürü upvotes alıyor çünkü sorunun başlığına cevap veriyor, ancak soru gövdesine cevap vermiyor: D OP her seferinde farklı bir zaman damgası almak istedi, oysa bu tüm senaryo için bir tane depolayacak.
fedorqui 'SO zarar vermeyi durdurun'

1
Buraya tam olarak aramaya geldim. Yani unix zaman damgası almak için uygun format dizesi date. Ancak "doğru" yanıtı da iptal ettim. Bunu aramıyordum, ama orijinal soruya daha iyi bir cevap ve benim için de gerçekten yararlı.
vastlysuperiorman

69
DATE=`date "+%Y%m%d"`

DATE_WITH_TIME=`date "+%Y%m%d-%H%M%S"` #add %3N as we want millisecond too

1
teşekkürler, istediğim buydu: benim senaryomda yeniden kullanmak için bir değişken olarak bir zaman damgası! Kabuk sözdizimi çok kafa karıştırıcı.
Poutrathor

2
Milisaniye parçayı eklemek için +1. Bu echo $(date +"%Y-%m-%dT%T.%3N%z") Ancak bir Mac terminalinde çalışmak için alamıyorum. Mac'te nasıl yapılır. Teşekkürler
kosgeinsky

43

ISO 8601 formatı ( 2018-12-23T12:34:56) UNIX zaman damgasından daha okunabilir. Ancak bazı işletim sistemlerinde :dosya adlarında bulunamazsınız . Bu nedenle bunun gibi bir şey kullanmanızı öneririz:

2018-12-23_12-34-56

Zaman damgasını bu biçimde almak için aşağıdaki komutu kullanabilirsiniz:

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

Bu, birçok uygulamanın kullandığı biçimdir. Bununla ilgili bir başka güzel şey, dosya adlarınız bununla başlıyorsa, bunları alfabetik olarak sıralayabileceğiniz ve tarihe göre sıralanacağıdır.


1
Teşekkürler Bu benim sürüm kontrolleri komut dosyası için harika
Andy

1
TZ=UTC date +...UTC zaman damgasını kullanarak bunu daha taşınabilir hale getirebilir
MichaelChirico

17

Ubuntu 14.04 kullanıyorum.

Sistemimdeki doğru yol olmalı date +%s.

Çıkışı date +%Tgibidir 12:25:25.


15

Komut ikamesini kullan:

timestamp=$( date +%T )

3
Bu zaten denedim ve sadece değişkenin başlatıldığı zamanı yazdırır.
Dan

10
@ dan08: Değişkenler böyle çalışır. Dinamik çıktı istiyorsanız bir işlev kullanın.
choroba

11

Kullanabilirsiniz

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

Bu formatta 2014-02-01 15:12:35-05:00

Back-tick ( `) karakterleri, aralarındaki şeyin değerlendirilmesine ve sonucun satıra dahil edilmesine neden olur. date --helpbaşka seçenekleri de var.


1
Ne zaman alacağına gelince, bu, ekran çıktısına veya çıktı zamanının listelenmesi amaçlanan bir günlük dosyasına dahil edilmeden hemen önce yürütülmelidir.
Bill

2
bu, çıktıdaki boşluk nedeniyle bir zaman damgası için ideal biçimden daha azdır. Kullanımda "$ timestamp" değerini belirttiğinizden emin olun, aksi takdirde komuta iki parametre alırsınız. örneğin touch $timestampiki dosya üretir.
harschware

8

Son sürümleri bashharici programa çağrı gerektirmez date:

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

%(...)Tkarşılık gelen bağımsız değişkeni UNIX zaman damgası olarak kullanır ve bunu strftimeparantezler arasındaki stil biçimine göre biçimlendirir. -1Mevcut zamana karşılık gelen bir argüman ve hiçbir belirsizlik meydana gelmeyebilir.


5

Avrupalı ​​arkadaşlarım için şunu kullanmayı deneyin:

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

şu biçimde bir biçim verecektir: "15-02-2020_19-21-58"

Değişkeni çağırır ve dize temsilini böyle alırsınız

$timestamp

1
Lütfen kodunuz için kod gösterimini kullanmayı düşünün.
sao

4
timestamp=$(awk 'BEGIN {srand(); print srand()}')

değeri olmayan srand, çoğu Awk uygulamasında geçerli zaman damgasını kullanır.


Bunu beğendim, çok yaratıcı!
TobiV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.