Вопрос или проблема
Итак, у меня есть 2 различных установки Linux. Одна из них – Ubuntu, а другая – Kali.
Когда я запускаю команду date
без опций/аргументов на своей установке Ubuntu, я получаю:
michal@ubuntu:~$ date
Чт 24 Мар 2022 07:56:23 PM CET
Когда я запускаю команду date
без опций/аргументов на своей установке Kali, я получаю:
┌──(michal㉿kali)-[~]
└─$ date
Чт Мар 24 07:58:34 PM CET 2022
Настройки локали одинаковы на обоих машинах:
Настройки locale
для Ubuntu:
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
для Kali:
┌──(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
Чт 24 Мар 2022 07:56:23 PM CET
Какой файл нужно редактировать? Где находятся эти настройки?
Я пытался следовать шагам из этой темы:
Как я могу изменить формат даты по умолчанию (используя LC_TIME)?
но я не понимаю, что означает:
“date
‘s texinfo также явно рекомендует установить LC_TIME в C, чтобы получить независимый от локали вывод.”
Формат по умолчанию для команды date(1)
глубоко встроен в систему локалей (в частности, в установку date_fmt
в LC_TIME
). Локаль – это система для указания зависимых от местоположения параметров, таких как, какой день недели идет первым, размер бумаги, форматы телефонных номеров, формат даты (d/m/y или m/d/y) и сколько цифр в каждом, и т. д.
Стандартный формат для пользователей en_US
(английский в США) изменился в 2018 году, как раз ПОСЛЕ выхода Ubuntu 18.04LTS. В США команда date(1)
выдает даты с 12-часовым форматом и AM или PM в них в версиях Ubuntu позже 18.04. Я не знаю, что сделали другие дистрибутивы или когда.
Локаль C/POSIX является независимой от местоположения локалью, которая никогда не изменится. Это то, что делали системы Unix до того, как начали регулировать локали. Ее локаль называется C.
У вас есть несколько вариантов, в зависимости от вашей ситуации:
-
Если у вас нет программного обеспечения, зависящего от старых данных, использовавших команду
date(1)
, вы можете просто с этим смириться. На самом деле, в США люди используют 12-часовой формат времени и AM/PM. -
Если, как и я, вы хотите продолжать использовать
date(1)
в скриптах, чтобы получить дату в конкретном формате, вы можете использовать спецификатор формата в командной строке:$ date +"%a %b %e %H:%M:%S %Z %Y" Пн Июн 12 15:30:44 EDT 2023
-
Вы также можете указать локаль для использования с переменной окружения
LANG
и установить ее в C:$ LANG=C date Пн Июн 12 15:30:44 EDT 2023
Это можно установить для данной оболочки с помощью
$ export LANG=C $ date Пн Июн 12 15:30:44 EDT 2023
Если вы хотите это для каждой оболочки, добавьте строку
export LANG=C
в~/.bash_aliases
. -
Если вы хотите, чтобы
date(1)
выдавала заданный формат без аргументов, даже когда ее вызывают другие пользователи или не из оболочки, тогда вам нужно изменить системный формат по умолчанию для командыdate(1)
. Это немного сложнее:# Измените одну строку в файле локали en_US: cd /usr/share/i18n/locales sed -e '/date_fmt/ s/%r/%H:%M:%S/' en_US > en_US@Cdate # Добавьте его в качестве поддерживаемой локали: cat >> /etc/locale.gen << EOF [email protected] UTF-8 EOF # Скомпилируйте базу данных локалей locale-gen # Выберите новую локаль (модифицирует /etc/default/locale) update-locale [email protected]
Это вступит в силу при новых входах в систему.
Вы можете указать date
, как он должен форматировать свой вывод:
%% литерал %
%a сокращенное название дня недели по локали (например, Вск)
%A полное название дня недели по локали (например, Воскресенье)
%b сокращенное название месяца по локали (например, Янв)
%B полное название месяца по локали (например, Январь)
%c дата и время по локали (например, Чт Мар 3 23:05:25 2005)
%C век; как %Y, но без последних двух цифр (например, 20)
%d день месяца (например, 01)
%D дата; то же самое, что и %m/%d/%y
%e день месяца, с пробелом; то же самое, что и %_d
%F полная дата; как %+4Y-%m-%d
%g последние две цифры года ISO номера недели (см. %G)
%G год ISO номера недели (см. %V); обычно полезно только с %V
%h то же самое, что и %b
%H час (00..23)
%I час (01..12)
%j день года (001..366)
%k час, с пробелом (0..23); то же самое, что и %_H
%l час, с пробелом (1..12); то же самое, что и %_I
%m месяц (01..12)
%M минута (00..59)
%n новая строка
%N наносекунды (000000000..999999999)
%p аналог AM или PM по локали; пусто, если не известно
%P как %p, но в нижнем регистре
%q четверть года (1..4)
%r время 12-часового формата по локали (например, 11:11:04 PM)
%R 24-часовой формат час и минута; то же самое, что и %H:%M
%s секунды с момента начала эпохи (1970-01-01 00:00 UTC)
%S секунды (00..60)
%t табуляция
%T время; то же самое, что и %H:%M:%S
%u день недели (1..7); 1 - понедельник
%U номер недели года, где воскресенье - первый день недели (00..53)
%V номер ISO недели, где понедельник - первый день недели (01..53)
%w день недели (0..6); 0 - воскресенье
%W номер недели года, где понедельник - первый день недели (00..53)
%x представление даты по локали (например, 12/31/99)
%X представление времени по локали (например, 23:13:48)
%y последние две цифры года (00..99)
%Y год
%z +hhmm числовая временная зона (например, -0400)
%:z +hh:mm числовая временная зона (например, -04:00)
%::z +hh:mm:ss числовая временная зона (например, -04:00:00)
%:::z числовая временная зона с : для необходимой точности (например, -04, +05:30)
%Z буквенное сокращение временной зоны (например, EDT)
В вашем случае команда будет выглядеть следующим образом:
date +"%a %d %b %Y %r %Z"
Устанавливая псевдоним, вы можете изменить поведение команды date
:
alias date="date +"%a %d %b %Y %r %Z""
Вы можете поместить псевдоним в файл ~/.bashrc
, чтобы сделать изменение постоянным для вашего текущего пользователя.
Ответ или решение
Чтобы навсегда изменить формат вывода команды date
в вашей системе Kali Linux, следует учесть несколько аспектов, связанных с локализацией и настройками системы. Давайте разберем эту задачу по пунктам, чтобы достичь желаемого результата.
Причины различий в выводе команды date
Вывод команды date
на разных ваших установках Linux (Ubuntu и Kali) отличается из-за спецификаций в настройках локали, в частности в параметрах, определяющих формат даты и времени. Параметры формата даты и времени определяются локалью LC_TIME
. У Ubuntu с 2018 года произошли изменения в форматировании даты в зависимости от локали, поэтому вывод может не совпадать на разных дистрибутивах, даже если локали, кажется, одинаковы.
Как изменить формат вывода команды date
на постоянной основе
1. Изменение локали
Для изменения формата вывода команды date
вы можете создать новую локаль с желаемыми настройками. Примерная последовательность команд выглядит следующим образом:
-
Перейдите в каталог локалей:
cd /usr/share/i18n/locales
-
Создайте новую локаль на основе текущей с измененным
date_fmt
:sed -e '/date_fmt/ s/%r/%H:%M:%S/' en_US > en_US@Cdate
-
Добавьте новую локаль в поддерживаемые локали:
echo "en_US@Cdate UTF-8" | sudo tee -a /etc/locale.gen
-
Сгенерируйте локали:
sudo locale-gen
-
Измените текущую локаль на новую:
sudo update-locale LANG=en_US@Cdate
Эти изменения вступят в силу после новой сессии (входа в систему).
2. Установка alias
Для временного решения, если вам не требуется изменять системные настройки, вы можете установить alias для команды date
в вашем ~/.bashrc
:
-
Откройте файл
~/.bashrc
в вашем текстовом редакторе:nano ~/.bashrc
-
Добавьте следующую строку, которая заменяет стандартную команду
date
на вашу версию с нужным форматом:alias date='date +"%a %d %b %Y %r %Z"'
-
Сохраните изменения и загрузите обновленный файл конфигурации:
source ~/.bashrc
Теперь при выполнении команды date
вы будете получать вывод в формате:
Thu 24 Mar 2022 07:56:23 PM CET
Заключение
Вы можете выбрать подходящий для вас способ изменения формата вывода команды date
, основываясь на ваших потребностях и уровне доступа к системным настройкам. Настройка локали подходит для более углубленного изменения, тогда как использование alias подходит для индивидуальных нужд пользователя. Если у вас остаются вопросы, не стесняйтесь обращаться за дополнительной помощью.