bash 스크립트에서 타임 스탬프 변수 만들기


375

로깅을 조금 더 쉽게하기 위해 쉘 스크립트에서 타임 스탬프 변수를 만들려고합니다. 스크립트 시작 부분에 변수를 작성하고 발행 할 때마다 현재 시간을 인쇄하고 싶습니다 echo $timestamp. 생각보다 어렵다는 것이 증명되었습니다. 내가 시도한 몇 가지 사항은 다음과 같습니다.

timestamp="(date +"%T")" 에코가 출력됩니다 (date +"%T")

timestamp="$(date +"%T")" echo는 변수가 초기화 된 시간을 인쇄합니다.

내가 시도한 다른 것은 더 이상 작동하지 않는 약간의 변형입니다. 누구든지 내가하려는 일을 성취하는 방법을 알고 있습니까?

답변:


309

고정 변수가 정의 된 시간이 아닌 현재 타임 스탬프를 얻으려면 변수가 아닌 함수를 사용하는 것이 좋습니다 .

#!/bin/bash

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

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

%T지정자가 제공 한 형식이 마음에 들지 않으면에서 허용하는 다른 시간 변환 지정자를 결합 할 수 있습니다 date. GNU의 date경우 공식 문서에서 https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html#Time-conversion-specifiers 에서 이러한 지정자의 전체 목록을 찾을 수 있습니다.


26
사용 방법에 따라 여전히 명령 대체를 사용해야 echo "$(timestamp): something happened"합니다.
chepner 2016 년

5
: 포맷에 관해서는, 여기에 가장 자주 형식으로 잘라 내기 및 건조 세트입니다 zxq9.com/archives/795
zxq9

175
나를 위해, 나는 원했다 date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson

3
어떤 이유로 이것은 타임 스탬프를 제공하지 않지만 사이에 ":"가있는 현재 시간을 제공합니다.
erikbwork

7
나는 많은 사람들이 유닉스 타임 스탬프를 생성하는 방법을 찾고있는이 질문에 도착한다고 생각한다.
hugesupersuperman

565

유닉스 타임 스탬프를 얻으려면 다음을 사용해야합니다.

timestamp=$(date +%s)

%T당신에게 시간을 줄 것입니다; %H:%M:%S( http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/ 를 통해 ) 와 동일


5
그러나이 변수는 변수가 시작된 시간의 값을 유지합니다. 맞습니까?
lindhe

9
나는 이것이 질문의 제목에 대답하기 때문에 많은 찬사를 받고 있다고 생각하지만 질문 본문에는 대답하지 않습니다 : D OP는 매번 다른 타임 스탬프를 얻고 싶었지만 전체 스크립트에 대해 하나를 저장하려고했습니다.
fedorqui 'SO 중지 피해'

1
나는 이것을 정확하게 찾아 여기에 왔습니다. 즉 적절한 형식 문자열로 유닉스 타임 스탬프를 얻을 수 있습니다 date. 그러나 나는 또한 "올바른"답변을 상향 조정했다. 나는 그것을 찾지 않았지만 원래 질문에 대한 더 나은 대답이며 나에게도 유용합니다.
vastsupersuperman

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

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

1
고마워, 그것이 내가 원했던 것입니다 : 스크립트에서 재사용 할 수있는 변수 인 타임 스탬프! 쉘 구문이 너무 혼란 스럽다.
Poutrathor

2
밀리 초 부분을 추가하는 경우 +1 이것은 echo $(date +"%Y-%m-%dT%T.%3N%z") 그러나 나는 그것이 맥 터미널에서 동작하지 않습니다. Mac에서 동일한 작업을 수행하는 방법 감사합니다
kosgeinsky

43

ISO 8601 형식 ( 2018-12-23T12:34:56)은 UNIX 타임 스탬프보다 읽기 쉽습니다. 그러나 일부 OS :에서는 파일 이름을 가질 수 없습니다 . 따라서 대신 다음과 같은 것을 사용하는 것이 좋습니다.

2018-12-23_12-34-56

다음 명령을 사용하여이 형식의 타임 스탬프를 얻을 수 있습니다.

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

이것은 많은 응용 프로그램에서 사용하는 형식입니다. 이것에 대한 또 다른 좋은 점은 파일 이름이 이것으로 시작하면 알파벳순으로 정렬 할 수 있으며 날짜순으로 정렬된다는 것입니다.


1
고마워 이것은 내 버전 관리 스크립트에 좋습니다
Andy

1
TZ=UTC date +...UTC 타임 스탬프를 사용하여이 더 휴대용 만들 수 있습니다
MichaelChirico

17

우분투 14.04를 사용하고 있습니다.

내 시스템의 올바른 방법은입니다 date +%s.

의 출력 date +%T은 같습니다 12:25:25.


15

명령 대체를 사용하십시오.

timestamp=$( date +%T )

3
이것은 이미 시도한 것이며 변수가 초기화 된 시간 만 인쇄합니다.
Dan

10
@ dan08 : 변수가 작동하는 방식입니다. 동적 출력을 원하면 기능을 사용하십시오.
choroba 2016 년

11

당신이 사용할 수있는

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

이것은 형식으로 제공 2014-02-01 15:12:35-05:00

백틱 ( `) 문자는 그 사이에있는 것을 평가하여 결과를 줄에 포함시킵니다. date --help다른 옵션이 있습니다.


1
시간이 얼마나 걸리는지는 화면 출력에 포함되기 직전에 실행되거나 출력 시간이 나열되도록 로그 파일이 실행되어야합니다.
Bill

2
이것은 출력의 공간으로 인해 타임 스탬프에 이상적인 형식보다 적습니다. 사용법에서 "$ timestamp"라고 인용하면 명령에 두 개의 매개 변수가 표시됩니다. 예를 들어 touch $timestamp두 개의 파일이 생성됩니다.
harschware

8

최신 버전의 bash외부 프로그램을 호출하지 않아도됩니다 date.

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

%(...)T해당 인수를 UNIX 타임 스탬프로 사용하고 strftime괄호 사이의 -style 형식 에 따라 형식을 지정합니다. 인수는 -1현재 시간 에 해당하며 모호성이 없을 때 생략 할 수 있습니다.


5

그리고 내 동료 유럽인들을 위해 이것을 사용해보십시오.

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

형식은 "15-02-2020_19-21-58"입니다.

변수를 호출하고 다음과 같이 문자열 표현을 얻습니다.

$timestamp

1
코드에 코드 표기법을 사용해보십시오.
사오

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

값이없는 srand는 대부분의 Awk 구현에서 현재 시간 소인을 사용합니다.


나는 이것을 매우 창의적으로 좋아합니다!
TobiV
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.