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$ '
我们每个人都设置了自己使用 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$ '