LINUX.ORG.RU
ФорумTalks

Леннарт теперь до эмуляторов терминала добрался

 , , ,


0

3

После очередного обновления systemd я обнаружил, что при входе в учетную запись рута под одним из эмуляторов терминала отображается вот такая абракадабра:

]8003;start=18dcf83c-b8a1-49a6-a824-d7a793edfd2c;user=root;hostname=aquila;machineid=609fc63f07736a785af67b1600000438;bootid=6bd8c743-1bf9-4965-88f0-5326eca7fc15;pid=661805;type=shell;cwd=/root[root@aquila ~]# 

Конкретно у меня - проблема со старой версией vte, на которой работают эмуляторы терминала, собранные под gtk2.

Поиск виновника привёл меня к следующим файлам:

/usr/lib/systemd/profile.d/70-systemd-shell-extra.sh
/usr/lib/systemd/profile.d/80-systemd-osc-context.sh

Потом к этому багрепорту: https://github.com/systemd/systemd/issues/39133

К этому: https://bugs.kde.org/show_bug.cgi?id=500842

И наконец к сути: https://github.com/systemd/systemd/blob/main/docs/OSC_CONTEXT.md

Машинный перевод для тех, кто плохо понимает английский: https://translate.google.com/?sl=en&tl=ru&text=https%3A%2F%2Fgithub.com%2Fsystemd%2Fsystemd%2Fblob%2Fmain%2Fdocs%2FOSC_CONTEXT.md&op=translate

В целом идея мне показалась не особо полезной, но направление мысли мне понравилось. Более содержательное общение приложения с эмулятором терминала - это хорошо. Я всегда приветствую развитие протоколов обмена обмена данными с терминалом.

★★★

Последнее исправление: wandrien (всего исправлений: 1)

Леннарт теперь не бешеный фотокорреспондент, он теперь убелённый благородными сединами умиротворённый хиппи. Работа в Microsoft облагораживает. Было Стало

lenin386 ★★★★
()
Последнее исправление: lenin386 (всего исправлений: 3)
Ответ на: комментарий от wandrien

могу предположить, что это даже чуть ли не единственный способ для приложения достучаться до терминала, особенно если это ssh через ssh. Главное что бы приложение умело само отключать это при редиректе stdout в файл, ну либо отдельный ключик для отключения

user_undefined ★★
()
Ответ на: комментарий от Shadow

Ну, мы живём в такое время, что ну его нафиг. Ко всему надо быть готовым.

...оптимизированные для работы в Powershell?

Это мысль. Надо будет спросить у разрабов MS.

sparkie ★★★★★
()
Ответ на: комментарий от wandrien

Идею умного терминала надо развивать и далее.

С этим никто не спорит.

Через ESC-последовательности приложения управляют цветом, выставляют заголовок терминала, получают или устанавливают системный буфер обмена и т.п.

Проблема начинается вот тут. Попытка натянуть всё это на глобус из stdout часто приводит к интересным глюкам, например, в виде цветовых кодов в текстовых логах. И не говори что не видел такого.

Мой аргумент тут в том, что лучше похоронить совместимость со старым шеллом один раз и сделать новый расширяемый стандарт со штуками типа объектов в пайпах, как в powershell. А не накручивать вагоны костылей на древнюю рухлядь.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Не видел. Такое мне не попадалось.

Если тебе приложение насрёт html-кодами в чисто текстовый лог, это же не проблема html. Это баг в приложении.

похоронить совместимость со старым шеллом один раз и сделать новый расширяемый стандарт

Шел тут вообще ни при чем. Абсолютно параллельная терминалу штука.

новый расширяемый стандарт

Поток байт это максимально расширяемый стандарт. Ты можешь пакетами, оформленными esc-послелователтностями передать любую информацию.

Хочешь, чтобы твой терминал рендерил древовидный json в отдельном окне? Не вопрос, бери код терминала и дописывай фичу. И потом отправляй туда пакеты вообще из любого приложения, хоть из раста, хоть из закорючек на баше.

А не накручивать вагоны костылей на древнюю рухлядь.

При попытке накрутить вагоны костылей на свежую рухлядь получается в лучшем случае qt, в худшем вейланд.

Вы всё время пытаетесь оверинженернуть что-нибудь там, где лучше всего работает просто максимально тупое решение в лоб.

wandrien ★★★
() автор топика
Ответ на: комментарий от hateyoufeel

расширяемый … как в powershell

Так текстовый как раз и есть расширяемый.

Вот допустим надо найти все файлы с ‘Ф’ в имени, подкрасить буквы ‘ы’, отсортировать и вывести. С bash это возможно, несмотря на то, что sort (и множество других утилит, которые могли бы быть в этом месте) знать не знает ни про какие цвета

find -name '*ф*' | grep --color=always 'ы\|^' | sort | less -R

Если у тебя объектовый шелл и у класса «список строк» нет цвета, то всё, приехали.

Баш он же не просто так такой живучий, при всей своей уродливости и коварности. Это юниксвей и он работает уже больше полувека.

legolegs ★★★★★
()
Ответ на: комментарий от Shadow

Там нет пайплайна, нет дешёвого форка на уровне синтаксиса, нет простого перенаправления ввода-вывода.

Вообще ничего нет, что соответствует концепции unix максимально дешево порождать короткоживущие процессы и максимально делегировать задачи подходящим внешним командам.

И при этом tcl это довольно монтруозная программа с накопленным внутренним легаси. Это не просто «скомпилировал из говна и палок на любом калькуляторе».

Сам tcl как концепция языка неплох. Батарейки - не нравятся.

Насчёт монтруозности, по этой же причине плох nushell. Это огромный бинарь с огромной внутренней логикой, который хочет максимально тебя завязать внутрь своей экосистемы. Это фреймворк со своим «видением».
Противоположность понятия shell, оболочка.

wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

Не видел. Такое мне не попадалось.

Бывает, что утилита не проверяет [ -t /dev/stdout ]. Обычно хипстота всякая. Раскрасят выхлоп красиво, чтоб в терминале запускать и на экране держать, а про перенаправление в файл не подумают. Но, т.к. у нас всё - текст, но при надобности все эти ESC+] можно вычистить, стопудово на стековерфло есть готовый скрипт.

legolegs ★★★★★
()
Ответ на: комментарий от wandrien

нет дешёвого форка
монтруозная
ничего нет, что соответствует концепции unix максимально дешево порождать короткоживущие процессы и максимально делегировать задачи подходящим внешним командам

легковесные tcl/tk десктоп тулзы из начала 90-х, не тормозящие на древнем SPARC или Pentium 66MHz с 8Мб RAM: «ну да, ну да».

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от Shadow

Ты не понимаешь, что речь не о скорости работы? Речь о удобстве разработки клея.

wandrien ★★★
() автор топика
Ответ на: комментарий от Shadow

И где они эти тулзы? Tkman не работает больше. Видимо, stable api оказалось nonsense.

wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

А там, глядишь, и CSS подтянется. И получится новое ненужно, потому что завести это дерьмо без браузера будет никак, а терминал на основе Chrome явно пропихнёт какой-нибудь недалёкий дятел.

Zhbert ★★★★★
()
Ответ на: комментарий от wandrien

Ты можешь пакетами, оформленными esc-послелователтностями передать любую информацию.

Передай мне нажатие Alt, просто Alt. Задалбывает в mc Alt+s постоянно нажимать.

GAMer ★★★★★
()
Ответ на: комментарий от Zhbert

А там, глядишь, и CSS подтянется. И получится новое ненужно, потому что завести это дерьмо без браузера будет никак, а терминал на основе Chrome явно пропихнёт какой-нибудь недалёкий дятел.

Ну так люди сами это всё делают. Тот, кто коммитит в условный htop, ncdu или mc, тот вряд ли будет делать нескучное-веб-приложение-в-терминале.

А кто пишет по веб-приложухе на каждый чих, те и щас наяривают на электроне, им отсутствие поддержки в терминале никак не мешает.

Принципиально ничего не изменится в этом отношении.

Так же как и с сайтами. Ничего же не мешает делать сайты, например такие:

wandrien ★★★
() автор топика
Ответ на: комментарий от GAMer

Передай мне нажатие Alt, просто Alt. Задалбывает в mc Alt+s постоянно нажимать.

Предлагаю подумать над моей мыслью еще раз.

wandrien ★★★
() автор топика
Ответ на: комментарий от GAMer

Видимо мысль от меня ускользает…

Мысль в том, что раз это возможно, то рано или поздно это кто-то запилит.

Как оказалось, уже вон запиливают.

wandrien ★★★
() автор топика
Ответ на: комментарий от EXL

Встроенные команды пестрят mindfuck’ами по типу IFS и прочего барахла даже для простейших вещей типа разбития строки, а синтаксис адовый и пестрит двадцатью видами кавычек и закорючек про которые нужно читать талмуды.

а как ты хотел? это тоже ЯП и его синтаксис нужно изучать. почему когда люди изучают программирование, они не жалуются, что нужно читать не только маны, а кучу литературы, а в баше всего лишь нужно прочитать маны, а они уже недовольны.

Iron_Bug ★★★★★
()

анальный зонд засовывается всё глубже и порождает новые проблемы.

лечится выкидыванием ненужно-д.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

Никаких проблем не порождает.

Терминал криво реализует требования ECMA-48 относительно OSC-команд.

wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

а терминал вообще брался поддерживать этот (уже явно абсолютно ненужный) стандарт? по-моему, если где-то не заявлено, что что-то поддерживается, то требовать этого, как минимум, странно.

терминалы давно работают в юникоде. какие, нафиг, ANSI escape-последовательности? что за бред. шёл 2025-й год, Леннарт впал в маразм и вспомнил детство золотое.

Iron_Bug ★★★★★
()
Ответ на: комментарий от wandrien

я не понимаю, нахрена в 2025-м году «модные молодёжные» стандарты 90-х, которые давно вышли из актуальности. у нас уже шеллы и эмуляторы терминалов давно работают не с ANSI и ASCII кодами. зачем натягивать сову на глобус?

это раскапывание стюардессы.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от wandrien

с юникодом UTF-8 (конкретно у меня вся система с ним работает). и уже давно. а так, у юзера терминал может работать с любыми представлениями, включая какие-нибудь UTF-16 или даже мультибайт, если юзер китаец, например.

когда приложение срёт в stdout, оно может явно запросить установку кодировки и локали. оно сообщает терминалу, как интерпретировать его выхлоп. времена, когда там были ASCII-коды, давно прошли. это было ещё когда я училась в школе. давненько, однако.

я не понимаю, зачем тащить стандарт такой давности в современные терминалы. и, главное, как это всё засовывать в произвольный терминал с настройками юзера. но даже если его туда засунуть, приложение может об этом ничего не знать и шарашить в выхлоп со своими установками кодировки и локали.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 3)

Напомните, Поттеринг сейчас оффицеально трудоустроен в Microsoft или пока ещё Redhat?

Camel ★★★★★
()
Ответ на: комментарий от Iron_Bug

Кодировка символов тут вообще ни при чем.

Речь идёт об управлении терминалом. Об управляющих командах.

Без управления терминалом у тебя даже libreadline не заработает.

wandrien ★★★
() автор топика
Ответ на: комментарий от wandrien

ой! а как, по твоему, терминал «управляется», если не потоком символов? это какая-то такая особая магия, да?

смысл этих excape-последовательностей был именно в том, что в потоке символов встречаются особые последовательности, которые терминал обрабатывает как-то специально. причём это пошло ещё с устройств, которые были до ПК-шек. все эти «возвраты каретки» и прочее, никаких кареток уже давно нет. ты предлагаешь каким-то странным образом вставлять управляющие символы ASCII в поток произвольного терминала с произвольными настройками локали юзера и с произвольными настройками выхлопа приложения. вопрос очевидный: КАК?

и при чём тут libreadline? он просто линкуется к софтине и умеет принимать некие команды юзера для работы с текстом. причём у него есть стандартные пресеты, типа там для емакса и ви, а можно настроить свои хоткеи. и кроме него есть ещё штук пять библиотек аналогичного функционала.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

Понятно, ты не шаришь.

На вопрос КАК отвечает спецификация, которую реализуют все популярные приложения терминалов.

Иначе бы у тебя ничего не работало просто.

wandrien ★★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 2)
Ответ на: комментарий от wandrien

я не шарю? я подозреваю, что я пишу софт дольше, чем ты живёшь. и ты не одупляешь, что ты пишешь про ECMA-48. поцтеринг тоже не одупляет. но он вообще невменяем, буен и опасен для сообщества разработчиков. все его поделия нужно выбрасывать сразу, не нюхая.

сотни разных терминалов прекрасно жили без поцтеринговской анальщины и будут и дальше жить без неё, я думаю.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от EXL

Лучше бы Lennart взялся за Bash.

это шаг номер два
терпение

olelookoe ★★★
()
Ответ на: комментарий от legolegs

Вот допустим надо найти все файлы с ‘Ф’ в имени, подкрасить буквы ‘ы’, отсортировать и вывести. С bash это возможно, несмотря на то, что sort (и множество других утилит, которые могли бы быть в этом месте) знать не знает ни про какие цвета

Очень всратая задача. Попробуй лучше вывести список файлов с заданными расширениями, отсортированный по размеру. И сделать это без awk и прочих cut.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel
find . -name '*.c' -printf "%s %p\n" | sort -n

Так что ли?

wandrien ★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Задача иллюстрирует расширяемость. Цвет — максимально чуждое телетайпу понятие, и тем не менее было прикручено к классическому юникс-стеку.

legolegs ★★★★★
()
Ответ на: комментарий от hateyoufeel

А почему это «без прочих cut»? Это часть системы.

find . -name '*.c' -type f -exec ls --sort=size {} +
legolegs ★★★★★
()

Я чо-т нихрена не понял, что там Леннарт намудрил. Вот что написано в скрипте, который мне на машину прилетел:

printf "\033]8003;start=%s%s;type=shell;cwd=%s\033\\" "$systemd_osc_context_shell_id" "$(__systemd_osc_context_common)" "$(__systemd_osc_context_escape "$PWD")"

А вот что написано в документе:

Fundamentally, there are two OSC 3008 commands defined:

* OSC "3008;start=" … (the start sequence) → this initiates, updates or indicates a return to a context. It carries a context identifier, and typically some metadata. This may be sent to first initiate a context. If sent again for the same context ID that was initiated already this indicates an update of the existing context. In this case, any previously set metadata fields for the context are flushed out, reset to their defaults, and then reinitialized from the newly supplied data. Also, in this case any subcontexts of the contexts are implicitly terminated.

* OSC "3008;end=" … (the end sequence) → this terminates a context. It carries a context identifier to close, initiated before with OSC "3008;start=". It may also carry additional metadata.

3008 и 8003 как бы две большие разницы.

wandrien ★★★
() автор топика

Конкретно у меня - проблема со старой версией vte, на которой работают эмуляторы терминала, собранные под gtk2.

Так, окей, это я починил.

diff -u -r src.orig/vte-0.28.2/src/caps.c src.2/vte-0.28.2/src/caps.c
--- src.orig/vte-0.28.2/src/caps.c	2025-10-09 22:03:56.000000000 +0700
+++ src.2/vte-0.28.2/src/caps.c	2025-10-10 00:24:09.297944433 +0700
@@ -554,6 +554,13 @@
 	{OSC "46;%s" ST, "change-logfile", 0},
 	{OSC "50;#%d" ST, "change-font-number", 0},
 	{OSC "50;%s" ST, "change-font-name", 0},
+	/* https://github.com/systemd/systemd/blob/0fe45b98dd737da86fcbb703809ebf2163c397f3/docs/OSC_CONTEXT.md */
+	{OSC "3008;%s" ST, "context-signalling", 0},
+	/* "osc-context: fix typo: 8003 -> 3008"
+	   https://github.com/systemd/systemd/commit/3b6288f6becf0e55da6de9ff55e824c2ada93f2c
+	   systemd 258 affected
+	   */
+	{OSC "8003;%s" ST, "context-signalling", 0},
 
 	/* These may be bogus, I can't find docs for them anywhere (#104154). */
 	{OSC "21;%s" BEL, "set-text-property-21", 0},
wandrien ★★★
() автор топика
Ответ на: комментарий от No

gcc в сообщениях об ошибках вставляет ссылки на документацию

Так вот что за срань портит мне отображение текста в lowdown: https://ibb.co/23HHthcH

Хорошо, что я создал эту тему, и тебе спасибо, что написал этот коммент.

Теперь надо заставить либо приложение отключить эту фичу, либо терминал игнорировать эти коды.

Не, фича крутая. Но в моём терминале не поддерживается.

wandrien ★★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от vbcnthfkmnth123

Как насчет tcc?

Скрипты на C? Они будут такими же неудобными и раздражающими пусть и чуть менее чем Bash. Ты со строками в C работал? А для скриптов обработка текстов и строк это одна из самых часто встречающихся проблем: сплитнуть строку, конкатенировать результат, найти подстроку, удалить часть и пр.

Тут можно было csh, tcsh посоветовать, но оно 1) мёртвое, 2) наполнено mindfuck’ами и какерством не хуже Bash’ей.

EXL ★★★★★
()
Ответ на: комментарий от Shadow

Конечно не хватает. Где башизмы и где адекватный синтаксис?

Мне в 2025 году не хватает возможности адекватного создания функций, циклов, switch’ей и др. базовых конструкций в дефолтном Shell’е.

А ещё мне не хватает нормальной стандартной библиотеки, чтобы для сплита строк я просто вызывал функции, а не занимался костыльным IFS’оложством.

EXL ★★★★★
()
Ответ на: комментарий от wandrien

Короче, пока так.

Правильный способ был бы - игнорировать все неизвестные OSC. Но мне пока лень вникать в код.

diff -u -r src.orig/vte-0.28.2/src/caps.c src.2/vte-0.28.2/src/caps.c
--- src.orig/vte-0.28.2/src/caps.c	2025-10-09 22:03:56.000000000 +0700
+++ src.2/vte-0.28.2/src/caps.c	2025-10-10 01:16:24.584042676 +0700
@@ -543,6 +543,9 @@
 	{OSC "2;%s" ST, "set-window-title", 0},
 	{OSC "3;%s" ST, "set-xproperty", 0},
 	{OSC "4;%s" ST, "change-color", 0},
+	{OSC "7;%s" ST, "report-current-directory", 0},
+	/* https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda */
+	{OSC "8;%s" ST, "hyperlink", 0},
 	{OSC "10;%s" ST, "change-foreground-colors", 0},
 	{OSC "11;%s" ST, "change-background-colors", 0},
 	{OSC "12;%s" ST, "change-cursor-colors", 0},
@@ -554,6 +557,13 @@
 	{OSC "46;%s" ST, "change-logfile", 0},
 	{OSC "50;#%d" ST, "change-font-number", 0},
 	{OSC "50;%s" ST, "change-font-name", 0},
+	/* https://github.com/systemd/systemd/blob/0fe45b98dd737da86fcbb703809ebf2163c397f3/docs/OSC_CONTEXT.md */
+	{OSC "3008;%s" ST, "context-signalling", 0},
+	/* "osc-context: fix typo: 8003 -> 3008"
+	   https://github.com/systemd/systemd/commit/3b6288f6becf0e55da6de9ff55e824c2ada93f2c
+	   systemd 258 affected
+	   */
+	{OSC "8003;%s" ST, "context-signalling", 0},
 
 	/* These may be bogus, I can't find docs for them anywhere (#104154). */
 	{OSC "21;%s" BEL, "set-text-property-21", 0},
wandrien ★★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от Shadow

Вот кстати TCL жаль, оно относительно приятное на фоне Bash’а и адекватное было.

И очень мощное. Лучше бы оно было Shell’ом.

EXL ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.