Tạo biến dấu thời gian trong tập lệnh bash


375

Tôi đang cố gắng tạo một biến dấu thời gian trong tập lệnh shell để làm cho việc đăng nhập dễ dàng hơn một chút. Tôi muốn tạo biến ở đầu tập lệnh và để nó in ra thời điểm hiện tại bất cứ khi nào tôi phát hành echo $timestamp. Nó chứng tỏ là khó khăn hơn tôi nghĩ. Đây là một số điều tôi đã thử:

timestamp="(date +"%T")" tiếng vang in ra (date +"%T")

timestamp="$(date +"%T")" echo in thời gian khi biến được khởi tạo.

Những thứ khác tôi đã thử chỉ là những biến thể nhỏ không hoạt động tốt hơn. Có ai biết làm thế nào để thực hiện những gì tôi đang cố gắng làm?

Câu trả lời:


309

Để có được dấu thời gian hiện tại và không phải là thời điểm khi một biến cố định được xác định, mẹo là sử dụng hàm chứ không phải biến:

#!/bin/bash

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

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

Nếu bạn không thích định dạng do trình %Txác định đưa ra, bạn có thể kết hợp các trình xác định chuyển đổi thời gian khác được chấp nhận bởi date. Đối với GNU date, bạn có thể tìm thấy danh sách đầy đủ các trình xác định này trong tài liệu chính thức tại đây: https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifier.html#Time-conversion-specifier


26
Tùy thuộc vào cách bạn định sử dụng cái này, bạn vẫn sẽ cần sử dụng lệnh thay thế : echo "$(timestamp): something happened".
chepner

5
Về định dạng, đây là một tập hợp các định dạng thường gặp nhất: zxq9.com/archives/795
zxq9

175
Đối với tôi, tôi muốn date +"%Y-%m-%d_%H-%M-%S"
Kimball Robinson

3
vì một số lý do, điều này không cho tôi dấu thời gian nhưng thời gian hiện tại có dấu ":" ở giữa.
erikbwork

7
Tôi nghĩ rằng rất nhiều người đến câu hỏi này để tìm cách tạo ra dấu thời gian unix (như tôi có) và tìm câu trả lời của dchakarov sẽ hữu ích hơn mặc dù câu trả lời này giải quyết tốt hơn câu hỏi của người hỏi.
differlysuperiorman

565

Nếu bạn muốn lấy dấu thời gian unix, thì bạn cần sử dụng:

timestamp=$(date +%s)

%Tsẽ cho bạn thời gian; tương tự như %H:%M:%S(thông qua http://www.cyberciti.biz/faq/linux-unix-formatted-dates-for-display/ )


5
Nhưng biến này sẽ chỉ giữ giá trị của thời gian khi biến được bắt đầu, tôi có đúng không?
lindhe

9
Tôi đoán điều này đang nhận được rất nhiều sự ủng hộ bởi vì nó trả lời tiêu đề của câu hỏi, nhưng nó không trả lời phần thân câu hỏi: D OP muốn có một dấu thời gian khác nhau mỗi lần, trong khi điều này sẽ lưu trữ một cho toàn bộ kịch bản.
fedorqui 'SO ngừng gây hại'

1
Tôi đến đây để tìm kiếm điều này chính xác. Tức là chuỗi định dạng thích hợp để lấy dấu thời gian unix từ đó date. Tuy nhiên, tôi cũng nêu lên câu trả lời "đúng". Tôi đã không tìm kiếm điều đó, nhưng đó là một câu trả lời tốt hơn cho câu hỏi ban đầu và nó cũng thực sự hữu ích với tôi.
differlysuperiorman 22/03/19

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

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

1
cảm ơn, đó là những gì tôi muốn: dấu thời gian như một biến để sử dụng lại trong tập lệnh của tôi! Cú pháp shell rất khó hiểu.
Poutrathor

2
+1 để thêm phần mili giây. Điều này echo $(date +"%Y-%m-%dT%T.%3N%z") tuy nhiên tôi không thể làm cho nó hoạt động trong một thiết bị đầu cuối Mac. Cách làm tương tự trong Mac. Cảm ơn
kosgeinsky 18/03/19

43

Định dạng ISO 8601 ( 2018-12-23T12:34:56) dễ đọc hơn dấu thời gian UNIX. Tuy nhiên trên một số HĐH bạn không thể có :trong tên tệp. Vì vậy, tôi khuyên bạn nên sử dụng một cái gì đó như thế này thay thế:

2018-12-23_12-34-56

Bạn có thể sử dụng lệnh sau để lấy dấu thời gian theo định dạng này:

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

Đây là định dạng tôi đã thấy nhiều ứng dụng sử dụng. Một điều thú vị khác về điều này là nếu tên tệp của bạn bắt đầu bằng tên này, bạn có thể sắp xếp chúng theo thứ tự bảng chữ cái và chúng sẽ được sắp xếp theo ngày.


1
Cảm ơn điều này là tuyệt vời cho kịch bản kiểm soát phiên bản của tôi
Andy

1
TZ=UTC date +...có thể làm cho điều này dễ dàng hơn bằng cách sử dụng dấu thời gian UTC
MichaelChirico

17

Tôi đang sử dụng Ubuntu 14.04.

Cách chính xác trong hệ thống của tôi nên được date +%s.

Đầu ra của date +%Tlà như thế 12:25:25.


15

Sử dụng lệnh thay thế:

timestamp=$( date +%T )

3
Đây là những gì tôi đã thử và nó chỉ in ra thời gian khi biến được khởi tạo.
Dan

10
@ dan08: Đó là cách các biến hoạt động. Sử dụng một chức năng nếu bạn muốn đầu ra năng động.
choroba

11

Bạn có thể dùng

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

Điều này cung cấp ở định dạng 2014-02-01 15:12:35-05:00

Các ký tự back-tick ( `) sẽ khiến cho những gì ở giữa chúng được đánh giá và có kết quả được bao gồm trong dòng. date --helpcó các lựa chọn khác.


1
Về thời gian, thời gian này sẽ được thực hiện ngay trước khi đưa vào màn hình đầu ra hoặc một tệp nhật ký dự định có thời gian của đầu ra được liệt kê.
Hóa đơn

2
đây là định dạng ít hơn định dạng lý tưởng cho dấu thời gian vì không gian trong đầu ra. Hãy chắc chắn trích dẫn "$ timestamp" trong cách sử dụng nếu không bạn sẽ nhận được hai thông số cho lệnh. ví dụ touch $timestampsẽ tạo ra hai tập tin
harschware

8

Các phiên bản gần đây bashkhông yêu cầu gọi chương trình bên ngoài date:

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

%(...)Tsử dụng đối số tương ứng làm dấu thời gian UNIX và định dạng nó theo strftimeđịnh dạng kiểu giữa các dấu ngoặc đơn. Một đối số -1tương ứng với thời gian hiện tại và khi không có sự mơ hồ sẽ xảy ra có thể được bỏ qua.


5

Và đối với đồng bào châu Âu của tôi, hãy thử sử dụng điều này:

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

sẽ đưa ra một định dạng của định dạng: "15-02-2020_19-21-58"

Bạn gọi biến và nhận đại diện chuỗi như thế này

$timestamp

1
Vui lòng xem xét sử dụng ký hiệu mã cho mã của bạn.
sao

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

srand không có giá trị sử dụng dấu thời gian hiện tại với hầu hết các triển khai Awk.


Tôi thích cái này, rất sáng tạo!
TobiV
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.