在[ts(1)]的ENVIRONMENT
部分man
页面下显示:ts
如果未将时区指定为日期的一部分,则标准 TZ 环境变量控制假定的时区日期。
我知道它使用 TZ 环境变量中指定的任何时区。但是,我不明白如何将时区指定为日期的一部分,我的理解是format
in 字段ts [-r] [-i | -s] [format]
可以以某种方式用于指定时区。
那么问题是,如何在ts
不改变环境变量的情况下为带有实用程序的时间戳指定所需的时区?
一些背景:
我的服务器与我位于不同的时区。因此,每当我使用ts
向输出添加时间戳时,我希望它显示在我当前的时区中。我不想更改TZ
环境变量,因为它可能会干扰当前正在运行的脚本或将要运行的脚本。
关于
format
该
format
字符串不是选择时区的接口。在我的 Debianman 1 ts
状态中:并且
man 3 strftime
不包含任何让我认为您可以在format
字符串中指定时区的内容。它提到了TZ
环境变量。AFAIK变量是选择时区的界面。format
是一个字符串,其中某些标记被扩展,其余的保持原样。例如%H
in%H:%M:%S
扩展到小时,但:
停留。在这个模型中,没有空间放置一个“配置”字符串,它会选择一个时区并消失。从理论上讲,它可以设计为与令牌集成,因此(例如)%H(CEST)
将扩展到所选时区(此处CEST
)中的小时。一种或另一种方式,这将是一个糟糕的解决方案。我们想要编写format
适用于任何时区的代码(包括字符串),我们希望能够在运行时指定时区。TZ
环境变量就是方式,一个简洁的设计。使用
TZ
“本地”在类似 POSIX 的 shell 中,专门为一个命令指定环境变量的一般语法是:
这将放在
var
运行的环境中executable
,而不改变shell的环境。请注意,如果一个进程(如
executable
)产生一个子进程,那么子进程将继承该变量,除非父进程旨在防止这种情况。ts
虽然不会创建孩子。示例用法
ts
:甚至:
(后者表明您可以
TZ
为管道中的每个进程单独指定。)笔记:
为什么会
TZ=UTC-8
产生日期UTC+8
?在交互式 shell 中,别名 like
alias ts='TZ=UTC-8 ts'
可能很有用。(请记住,如果您现在尝试运行TZ=UTC-5 ts
,则别名会将其更改为TZ=UTC-5 TZ=UTC-8 ts
并且别名中的值将获胜。)如果
ts
从脚本运行,则:TZ
为整个脚本(TZ=… ./the_script
)指定;可能您不希望这样做,因为通常脚本的其他部分会受到影响。ts
变成TZ=… ts
. 您更改格式字符串的想法需要进行类似的修改,所以我想这对您来说不是问题。包装器
如果您想
ts
在不修改脚本的情况下影响脚本,您可以创建一个将被调用的包装器,而不是真正的ts
. 这是一个示例包装脚本:笔记:
/usr/bin/ts
用作真实的ts
;如果需要,调整此路径。unalias ts
.命名脚本
ts
,使其可执行( )并将其移动到您chmod +x ts
之前出现的目录(您可能需要创建这样的目录并相应地扩展您的目录;我使用)。/usr/bin
PATH
PATH
$HOME/bin
从现在开始,环境变量的非空值
TS_TZ
将覆盖TZ
.ts
这意味着您可以执行以下操作:并为您
ts
自动使用TZ=UTC-8
. 即使在新启动的脚本中也会发生这种情况,如果仅ts
在脚本中根据您的PATH
.如果
TS_TZ
未设置或为空,则包装器将在没有任何技巧的情况下执行到真实的ts
,就好像包装器不存在一样。换句话说,包装器是透明的,除非TS_TZ
它在环境中并且它不是空的。可是等等!
可是等等。
man 1 ts
包含以下语句:这是否意味着时区可能会或可能不会被指定为日期的一部分?如果不在,可以在哪里指定
format
?好吧,看起来这适用于您使用时作为输入
-r
提供的日期。你可以这样做:
并且语句的意思
Aug 20 23:59:59
将被解释为好像它也在TZ=UTC-8
.旁注:手册说“支持许多常见的时间戳格式”(作为输入),但我找不到包含有关时区信息并受支持的格式。