Чипи-чипи, чапа-чапа. Привет, на скрине 🚫некий Linux бедолага очень обрадовался, когда нашел пасхалку в команде date. Этакий нигде недокументированный аргумент.

date --iso=seconds

Ну да, если запросить help либо глянуть в гуглах, такая конструкция нигде не упоминается.

Молодец чо. НО, если бы он знал про функцию getopt_long, то вряд ли сделал открытие. Ща расскажу в чем прикол.

Короче, куча программ и утилит используют функцию getopt_long для перебора командной строки. И эта функция распознает сокращения в длинных аргументах и опциях.

Собственно вот оригинальная команда:

date --iso-8601=seconds

Но если пропустить её через getopt_long, получим ту самую «пасхалку»:

date --iso=seconds

Еще примеры для понимания:

1. nano --smart --book
2. ls --hyper --show
3. du --one --human --sum
1. --smarthome --bookstyle
2. --hyperlink --show-control-chars
3. --one-file-system --human-readable --summarize

Понял в чем прикол? Но это еще не всё!

Утилиты из состава пакета coreutils, поддерживают сокращения аргументов и опций. Смотри:

for i in d h m s n; do date -I"$i"; done

2024-05-14
2024-05-14T09+00:00
2024-05-14T09:59+00:00
2024-05-14T09:59:37+00:00
2024-05-14T09:59:37,850707267+00:00
-Id == -Idate
-Ih == -Ihours
-Im == -Iminutes
-Is == -Iseconds
-In == -Ins

Аналогично с длинными опциями:

for i in d h m s n; do date --iso="$i"; done

2024-05-14
2024-05-14T10+00:00
2024-05-14T10:01+00:00
2024-05-14T10:01:57+00:00
2024-05-14T10:01:57,460027853+00:00
--iso=d == --iso-8601=date
--iso=h == --iso-8601=hours
--iso=m == --iso-8601=minutes
--iso=s == --iso-8601=seconds
--iso=n == --iso-8601=ns

Ну и на примере ls и sort:

ls --col=al | cat
--col=al == --color=always
printf '%s\n' {20..1} | sort --so=n
--so=n == --sort=numeric

Вся эта байда с сокращением, реализуется с помощью функций из библиотеки Gnulib, которые в свою очередь опираются на функции glibc.

Что имеем?

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Не нужно искать пасхалки там, где их нет.

Такие дела!