BASHRC PS1 显示日期时间但加上 3 小时

BASHRC PS1 show datetime but plus 3 hours

我们每个人都设置了自己使用 Linux shell 的便利,例如我使用 /root/.bashrc

PS1='[\h:\w] \D{%F %T}\n$ '

显示服务器名称 + 当前服务器日期时间 + 命令换行 - 看起来像

[servername217:~] 2022-02-06 00:55:02
#

但是我遇到了一个绊脚石,语法试图设置不是服务器时间,而是我的家,例如加上 3 小时。使用常规 BASH

很容易制作
date -d '+ 3 hour' '+%F %T'

但是当我尝试使用时,例如,

PS1='[\h:\w] [date -d '+ 3 hour' '+%F %T']\n$ '

我总是出错。好像PS1只看懂了

\D{%F %T}

但如何在这种格式下将 3 小时添加到 %T?或者还有其他方法吗?

这可能有帮助:

PS1="[\h:\w] $(date -d '+ 3 hour' '+%F %T')\n$ "

使用外部date命令有点太重量级了。如果你有 Bash 4.3+ 你可以使用内置 printf %(fmt)T:

$ cat ps1
NOW_PLUS_3_HOURS=''

function _prompt_command()
{
    local secs

    printf -v secs '%(%s)T'
    (( secs += 3 * 3600 ))
    printf -v NOW_PLUS_3_HOURS '%(%F %T)T' $secs
}

PROMPT_COMMAND=_prompt_command
PS1='[$NOW_PLUS_3_HOURS] $ '
$ date +'%F %T'
2022-02-06 16:37:02
$ source ./ps1
[2022-02-06 19:37:06] $
[2022-02-06 19:37:11] $

并且通过使用 PROMPT_COMMAND 你可以做很多更有趣的事情。

对于 bash v4.2 或更高版本,您可以使用 printf 日期格式说明符。这应该比在每个提示符下分叉一个新的 date(1) 进程更有效:

PS1='[\h:\w] $(printf "%(%F %T)T" "$((\D{%s} + 60*60*3))")\n$ '

就个人而言,我更喜欢用 PROMPT_COMMAND 设置一个变量(在每个提示符之前执行的字符串),而不是 PS1 中的命令替换,并在 PS1 中使用它.例如,如果命令导致问题,这使得取消设置 PROMPT_COMMAND 变得容易。

可以这样做(bash 4.3 或更高版本需要 printf "%(%s)T" 打印当前日期):

PROMPT_COMMAND='
ps1_date=$(printf "%(%F %T)T" \
"$(($(printf "%(%s)T") + 60*60*3))"
)'

或者这个(${ps1_date@P} 需要 4.4 或更高版本):

PROMPT_COMMAND='
    ps1_date="\D{%s}"
    ps1_date=${ps1_date@P}
    ps1_date=$(printf "%(%F %T)T" "$((ps1_date+60*60*3))")'

然后在这里使用那个变量:

PS1='[\h:\w] ${ps1_date}n$ '