永久更改 Kali Linux 中“date”命令的输出格式

永久更改 Kali Linux 中“date”命令的输出格式

所以我有 2 个不同的 Linux 安装。其中之一是Ubuntu,第二个是Kali。

当我date在 Ubuntu 安装上运行不带选项/参数的命令时,我得到:

michal@ubuntu:~$ date
Thu 24 Mar 2022 07:56:23 PM CET

当我date在 Kali 安装上运行不带选项/参数的命令时,我得到:

┌──(michal㉿kali)-[~]
└─$ date
Thu Mar 24 07:58:34 PM CET 2022

两台机器上的区域设置是相同的: Ubuntulocale设置:

michal@ubuntu:~$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

和卡利locale设置:

┌──(michal㉿kali)-[~]
└─$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

为什么date两台机器上的命令输出不同?

我想永久更改 Kali 输出,使其与我当前的 Ubuntu 输出相同:

michal@ubuntu:~$ date
Thu 24 Mar 2022 07:56:23 PM CET

需要编辑哪个文件?这些设置在哪里?

我尝试按照该线程中的步骤进行操作: 如何更改默认日期格式(使用 LC_TIME)? 但我不明白什么:“date的 texinfo 还明确建议将 LC_TIME 设置为 C为了产生独立于语言环境的输出。”的意思。

答案1

您可以知道date它应该如何格式化其输出:

%%   a literal %
  %a   locale's abbreviated weekday name (e.g., Sun)
  %A   locale's full weekday name (e.g., Sunday)
  %b   locale's abbreviated month name (e.g., Jan)
  %B   locale's full month name (e.g., January)
  %c   locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
  %C   century; like %Y, except omit last two digits (e.g., 20)
  %d   day of month (e.g., 01)
  %D   date; same as %m/%d/%y
  %e   day of month, space padded; same as %_d
  %F   full date; like %+4Y-%m-%d
  %g   last two digits of year of ISO week number (see %G)
  %G   year of ISO week number (see %V); normally useful only with %V
  %h   same as %b
  %H   hour (00..23)
  %I   hour (01..12)
  %j   day of year (001..366)
  %k   hour, space padded ( 0..23); same as %_H
  %l   hour, space padded ( 1..12); same as %_I
  %m   month (01..12)
  %M   minute (00..59)
  %n   a newline
  %N   nanoseconds (000000000..999999999)
  %p   locale's equivalent of either AM or PM; blank if not known
  %P   like %p, but lower case
  %q   quarter of year (1..4)
  %r   locale's 12-hour clock time (e.g., 11:11:04 PM)
  %R   24-hour hour and minute; same as %H:%M
  %s   seconds since the Epoch (1970-01-01 00:00 UTC)
  %S   second (00..60)
  %t   a tab
  %T   time; same as %H:%M:%S
  %u   day of week (1..7); 1 is Monday
  %U   week number of year, with Sunday as first day of week (00..53)
  %V   ISO week number, with Monday as first day of week (01..53)
  %w   day of week (0..6); 0 is Sunday
  %W   week number of year, with Monday as first day of week (00..53)
  %x   locale's date representation (e.g., 12/31/99)
  %X   locale's time representation (e.g., 23:13:48)
  %y   last two digits of year (00..99)
  %Y   year
  %z   +hhmm numeric time zone (e.g., -0400)
  %:z  +hh:mm numeric time zone (e.g., -04:00)
  %::z  +hh:mm:ss numeric time zone (e.g., -04:00:00)
  %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
  %Z   alphabetic time zone abbreviation (e.g., EDT)

在您的情况下,命令如下:

date +"%a %d %b %Y %r %Z"

通过设置别名,您可以更改date命令的行为:

alias date='date +"%a %d %b %Y %r %Z"'

您可以将别名放入您的帐户中,~/.bashrc以使当前用户的更改永久生效。

答案2

命令的默认格式date(1)深埋在语言环境系统中(具体来说,是date_fmt中的设置LC_TIME)。 Locale 是用于指定与位置相关的内容的系统,例如一周中的哪一天首先出现、纸张大小、电话号码格式、是 d/m/y 还是 m/d/y 以及每个数字的位数等。

2018 年 Ubuntu 18.04LTS 发布后,(美国英语)用户的默认设置date(1)发生了变化。en_US在美国,date(1)在高于 18.04 的 Ubuntu 版本中,该命令生成的日期采用 12 小时制,其中包含 AM 或 PM。我不知道其他发行版做了什么或什么时候做的。

C/POSIX 语言环境是一种与位置无关的语言环境,保证永远不会更改。这几乎就是 Unix 系统在开始调整语言环境之前所做的事情。它的语言环境称为 C。

根据您的情况,您有多种选择:

  1. 如果您没有依赖于使用该date(1)命令的旧数据的软件,您可以考虑继续使用它。事实上,在美国,人们使用 12 小时制和 AM/PM。

  2. 如果像我一样,您想继续date(1)在脚本中使用以特定格式生成日期,则可以在命令行中使用格式说明符:

    $ date +"%a %b %e %H:%M:%S %Z %Y"
    Mon Jun 12 15:30:44 EDT 2023
    
  3. 您还可以指定与环境变量一起使用的区域设置LANG,并将其设置为 C:

    $ LANG=C date
    Mon Jun 12 15:30:44 EDT 2023
    

    可以为给定的 shell 设置

    $ export LANG=C
    $ date
    Mon Jun 12 15:30:44 EDT 2023
    

    如果您希望每个 shell 都使用它,请将export LANG=C行放入~/.bash_aliases.

  4. 如果您想要date(1)生成不带参数的给定格式,即使是由其他用户调用或不是从 shell 调用,那么您需要更改该date(1)命令的系统默认格式。这涉及更多一点:

    # Modify one line in the en_US locale file:
    cd /usr/share/i18n/locales
    sed -e '/date_fmt/ s/%r/%H:%M:%S/'  en_US > en_US@Cdate
    
    # List it as a supported locale:
    cat >> /etc/locale.gen << EOF
    [email protected] UTF-8
    EOF
    
    # compile the locale database
    locale-gen
    
    # select the new locale (modifies /etc/default/locale)
    update-locale [email protected]
    

这对新登录生效。

相关内容