crantok Asked: 2025-03-06 20:32:21 +0800 CST2025-03-06 20:32:21 +0800 CST 2025-03-06 20:32:21 +0800 CST Bash 提示符中的时间不会随时间而改变 772 我更改了 .bashrc 中的提示符以显示当前时间。这是原始提示符(来自全新 MX Linux 安装) PS1="$PURPLE\u$nc@$CYAN\H$nc:$GREEN\w$nc\\n$GREEN\$$nc " 我把它改成了 PS1="$PURPLE\u$nc@$CYAN\H$nc $YELLOW$(date '+%Y-%m-%d %H:%M:%S')$nc $REEN\w$nc\\n$GREEN\$$nc " 当我打开终端时,我在提示符中看到当前日期和时间。新提示符不会显示其生成时间。它们总是显示与第一个提示符相同的时间。我做错了什么? bash 2 个回答 Voted Best Answer Stephen Kitt 2025-03-06T20:41:09+08:002025-03-06T20:41:09+08:00 在双引号内,扩展发生在评估时,这意味着在分配date时运行PS1- 这会产生您看到的结果,其中日期和时间最初存储并且从未更新。 您需要使用单引号括住date替换,以便每次显示提示时对其进行评估: PS1="$PURPLE\u$nc@$CYAN\H$nc $YELLOW"'$(date "+%Y-%m-%d %H:%M:%S")'"$nc $GREEN\w$nc\\n$GREEN\$$nc " 除了手动调用之外date,您还可以使用 shell 内置的日期支持:\d用“星期几月份日期”格式的日期替换,\D{format}用给定格式的日期替换,语法与您使用的语法相同strftime。因此: PS1="$PURPLE\u$nc@$CYAN\H$nc $YELLOW\\D{%Y-%m-%d %H:%M:%S}$nc $GREEN\w$nc\\n$GREEN\$$nc " 这里使用双引号的优点是,所有其他变量扩展都在变量首次求值时发生,这样每次显示提示时都可以节省一些(微不足道的)时间。由于提示中使用的变量不太可能发生变化,因此这里没有任何缺点。 有关详细信息,请参阅Bash 手册中的控制提示符。 markp-fuso 2025-03-07T02:18:04+08:002025-03-07T02:18:04+08:00 另一种选择......转义$in$(date ...)以防止在定义date时执行调用;新的定义变成:PS1 PS1="$PURPLE\u$nc@$CYAN\H$nc $YELLOW\$(date '+%Y-%m-%d %H:%M:%S')$nc $REEN\w$nc\\n$GREEN\$$nc " ^-------- escape the $
在双引号内,扩展发生在评估时,这意味着在分配
date
时运行PS1
- 这会产生您看到的结果,其中日期和时间最初存储并且从未更新。您需要使用单引号括住
date
替换,以便每次显示提示时对其进行评估:除了手动调用之外
date
,您还可以使用 shell 内置的日期支持:\d
用“星期几月份日期”格式的日期替换,\D{format}
用给定格式的日期替换,语法与您使用的语法相同strftime
。因此:这里使用双引号的优点是,所有其他变量扩展都在变量首次求值时发生,这样每次显示提示时都可以节省一些(微不足道的)时间。由于提示中使用的变量不太可能发生变化,因此这里没有任何缺点。
有关详细信息,请参阅Bash 手册中的控制提示符。
另一种选择......转义
$
in$(date ...)
以防止在定义date
时执行调用;新的定义变成:PS1