Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В первую очередь это нужно для автоматического тестирования программ, рисующих что-то на терминале с помощью curses, по моему мнению. Как иначе написать тесты для программы, которая ждёт, что пользователь нажмёт клавишу, и выводит результаты в определенное место экрана средствами curses?
#!/usr/bin/perl -w
use strict;
open(HC, "+</dev/tty");
my $s = "Hello, world!\n";
for(my $i=0; $i < length($s); ++$i)
{
ioctl HC, 0x5412, substr( $s, $i, 1 );
}
$ tty # In one session: find out this terminal's output device.
$ printf "$(tput setaf 1)Follow the $(tput setaf 7)white$(tput setaf 1) rabbit." > ttys006 # In another session: write to the first one.
Большинство PTY используют ANSI для control sequences, но я бы все же не полагался на это, и доверял terminfo.В ROTE заявлена эмуляция VT100, который использует ANSI, так что пока остается жить с этим. Надо посмотреть, как обстоят дела в libvterm.
Вот, например, как писать в терминал без всяких библиотек, just for fun.Насколько я понимаю, ROTE примерно так и делает и обрабатывает то, что поступает в файл терминала, применяя это к своим структурам данных, в которых хранится состояние терминала. Хочется по (x, y) ячейки получать её символ, цвет текста, цвет фона, это в тестах и используется.
xterm -e my_command. Терминалы <A-Fn$gt; такого действительно не позволяют, забирая информацию о том, что нужно запускать, из /etc.Спасибо за ответ. Что такое <A-FN$>?Там
$gt; — я просто случайно написал $ вместо амперсанда. Я имел ввиду эмуляторы терминала, создаваемые самим ядром при запуске (в X11 доступны через <C-A-Fn, в самих эмуляторах или после какого‐то <A-SysRq-…> без <C-).Возможно, я неправильно понял man, но мое представление об эмуляторах терминала отсюда: linux.die.net/man/4/ptmxТаким образом вы никак не получите эмулятор терминала. Эмулятор терминала — эта та программа, которая читает, а затем показывает обратно. То, из чего она читает эмулятором терминала не является и в
Согласно описанию, нужно открыть /dev/ptmx, получить a file descriptor (первое устройство, в которое писать), потом сделать некие телодвижения и получить второе устройство, /dev/pts* — из которого читать.
man 4 ptmx нигде не написано, что это эмулятор. Терминал ≠ эмулятор терминала; обычно в man страницах в linux терминал = устройство терминала, не более.Вы правы, теоретически можно обойтись без устройств. Но практически так никто делать не станет. Не говоря уже о ls, который обрезает control sequences, su и passwd не читают из pip'ов.Во‐первых ls не обрезает, а не выводит. Во‐вторых, ls можно заставить, так же как и grep и много других программ со схожим поведением (тот же pv (pipe viewer) и bash тоже можно — они ничего не делают с цветами, но поведение терминал/не терминал различается). В‐четвёртых, я сильно подозреваю, что так делали и делают, когда получают несанкционированный shell на сервере: pty создать там не особо нужно, и может быть просто невозможно из‐за отсутствия прав.
ROTE устанавливается простым ./configure && make && make install. Надо отследить, чтобы она установилась туда, где её увидит система сборки. Я использую для этого make install prefix=/usrОбычно если есть configure, то корректный вариант никак не
make install prefix=/usr, а ./configure --prefix=/usr.--prefix=/usr и, уж точно, никогда и никому не рекомендовать так делать. Если вам нравиться помойка в системе — это ваше право, нормальные люди же либо создают пакет (в данном случае — скорее используют имеющийся), либо ставят куда‐нибудь в /opt, откуда можно удалить практически одной командой (+ вычищение мусора из /etc, но /etc можно организовать так, что это это очищение сведётся к hg backout --commit {offending-revision}, да и мусор строго в двух известных местах — там, где определяется $PATH и другие переменные окружения (e.g. MANPATH) и там, где определяются пути до библиотек (в Gentoo это вообще можно иметь в одном месте: /etc/env.d)).make prefix=… install нестандартный) анализ в то время, как могли этого избежать../configure --prefix вам нужно прочитать ./configure --help. При использовании вашего способа вам нужно прочитать configure.ac и неопределённое количество файлов с исходным кодом (или, по крайней мере, определить «на живую», куда был сохранён prefix (здесь — три файла) и где это «куда» используется). Только так вы можете проверить корректность make prefix=. Прочитав Makefile вы не можете проверить корректность вашего метода, потому что Makefile не является единственным файлом, в который этот prefix используется.make prefix=… install, прочитав Makefile, так как Makefile не является единственным файлом, в котором configure сохраняет prefix../configure --prefix=… работает всегда, когда используется configure, сгенерированный с помощью autotools (других configure я, к счастью, не видел). make prefix=… install есть опасная привычка, которая гарантированно ведёт к некорректному результату в случае проектов с ресурсами, импортируемыми из $prefix/share (примеры: Vim, zsh, fish).
Библиотека эмуляции терминала ROTE и Lua привязки