我试图在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并让它在发出echo $timestamp时打印出当前时间。事实证明这比我想象的要困难得多。以下是我尝试过的一些方法:

timestamp="(date +"%T")"回显输出(date +"%T")

timestamp="$(date +"%T")"回显变量初始化的时间。

我尝试过的其他方法都只是细微的变化,效果并不好。有人知道我要怎么做吗?


当前回答

有很多答案,但找不到我想要的:

date +"%s.%3N"

返回类似1606297368.210的内容

其他回答

如果你想获取unix时间戳,那么你需要使用:

timestamp=$(date +%s)

T会给你刚好的时间;与%H:%M:%S相同(通过http://www.cyberciti.biz/faq/linux-unix-formatting-dates-for-display/)

最新版本的bash不需要调用外部程序日期:

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

%(…)T使用相应的参数作为UNIX时间戳,并根据括号之间的strftime格式对其进行格式化。参数-1对应于当前时间,当不会出现歧义时可以省略。

避免叉! !

必须为每一行日志运行日期是多余的!!

尽可能使用bash的内置。

更新2023

在提出这个问题时,bash版本是bash-4.2。

在这个版本中,纯bash打印当前时间的方式是:

printf '%(%T)T\n' -1

or

printf '%(%T)T\n' -1

所以一个简短的函数登录每一行的时间戳可以是:

logLine() {
    printf '%(%T)T %s\n' -1 "$*"
}

Then

$ logLine Hello world.
10:11:32 Hello world.

今天,我使用bash-5.1.4…

从bash版本5.0-alpha开始,(2018-05-22):

b.变量EPOCHSECONDS扩展为以秒为单位的时间 从Unix时代开始。 c.有一个EPOCHREALTIME变量,扩展为以秒为单位的时间 从Unix时代开始的微秒粒度。

所以如果你想使用微秒粒度,函数可以变成:

logLine() {
    local now=$EPOCHREALTIME
    printf '%(%T)T.%s %s\n' ${now%.*} ${now#*.} "$*"
}

Then

$ logLine Hello world.
10:15:56.862732 Hello world.

重要提示:不要混淆EPOCHREALTIME和EPOCHSECONDS!!

如果性能是一个问题,@chepner的答案是一个明显的赢家。

稍微复杂一点的是,您还可以只使用bash内置程序获得微秒或毫秒级的粒度。下面是一个函数的例子,它发出包含毫秒的当前时间戳:

timestamp() {
    IFS=. read S US <<<$EPOCHREALTIME # Read epoch seconds/microseconds
    MS=$((10#$US/1000)) # Convert to milliseconds (interpret in base-10, even with leading 0)
    printf '%(%F %T)T.%03i' $S $MS # Emit formatted timestamp
}

TS=$(timestamp) # Invoke function, assign to variable

请注意,printf格式可以调整为您首选的日期/时间格式。

这比您要求的要多一点,因此您可以根据需要定制它。

我试图在一个shell脚本中创建一个时间戳变量…

这个脚本将允许您创建一个变量。尽管我不完全确定在更改shell上下文时可重用性如何。但它会起作用。

function timestamp {
    TEXT="Date:"
    DATE=`date +%Y-%m-%d`
    TIME=`date +%H:%M:%S`
    ZONE=`date +"%Z %z"`
    echo $TEXT $DATE $TIME $ZONE
}

function fulldate {
  timevariable=$(timestamp)
  echo $timevariable
}

echo "- Output 1:"
timestamp
echo "- Output 2:"
fulldate
echo "- Output 3:"
echo $timevariable

输出:

- Output 1:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 2:
Date: 2021-08-12 23:28:08 UTC +0000
- Output 3:
Date: 2021-08-12 23:28:08 UTC +0000

我已经在GNU bash版本4.4.23(1)-release (x86_64-pc-msys)上进行了测试