При наличии команды, которая меняет свое поведение, когда ее вывод поступает на терминал (например, производит цветной вывод), как этот вывод может быть перенаправлен в конвейер при сохранении измененного поведения? Для этого должна быть полезность, о которой я не знаю.
Некоторые команды, например grep --color=always
, имеют флажки параметров для принудительного поведения, но вопрос заключается в том, как обойти программы, которые полагаются исключительно на тестирование своего дескриптора выходного файла.
Если это имеет значение, моя оболочка bash
на Linux.
Ответы:
Вы можете получить то, что вам нужно, используя
unbuffer
.unbuffer
этоtcl
/expect
скрипт. Посмотрите на источник, если хотите. Также обратите внимание на раздел CAVEATS в man.Также обратите внимание, что он не выполняет псевдонимы, такие как:
если только не добавить трюк, как отметил Стефан Шазелас:
Если вы сделаете
alias unbuffer='unbuffer '
(обратите внимание на завершающий пробел), то псевдонимы будут расширены послеunbuffer
.источник
alias unbuffer='unbuffer '
(обратите внимание на завершающий пробел), то псевдонимы будут расширены послеunbuffer
.unbuffer
это!sudo apt install expect
- Это было неясно.История наборов инструментов
Вы не первый человек, который хочет такой инструмент. Люди давно хотят таких инструментов. И они существовали почти так же долго.
Самым ранним инструментом для такого рода вещей был пакет «pty» Дэниела Дж. Бернштейна, который Рич Зальц назвал «ножом Гинсу», который Бернштейн написал в конце 1990-х для того, чтобы обмануть nethack (sic!). Версия 4 пакета «pty» была опубликована в 1992 году
comp.sources.unix
(том 25, выпуск 127–135). Это все еще можно найти в World Wide Web. Пол Vixie описал это в то время:Позднее Бернштейн обновил это, когда-то в 1999-04-07 или ранее, пакетом "ptyget", который он объявил:
Этот отдельный пакет был пакетом "sess".
Кстати, «ptyget» отличается тем, что служит примером очень ранней версии и одного из немногих опубликованных примеров собственной, никогда не публикуемой системой сборки «redo» Берштейна.
dependon
является явным предшественникомredo-ifchange
.использование
ptybandage
ptybandage
это то, что люди обычно хотят в сеансе входа в систему. Его основной вариант использования - создание программ, которые чувствительны к тому, работают ли их стандартные входы, выходы или ошибки с терминалами так, даже если они на самом деле находятся в конвейерах оболочки, или их стандартные файловые дескрипторы перенаправлены в файл.Он принимает команду для запуска (которая, конечно, должна быть правильной внешней командой) и запускает ее таким образом, что он думает, что его стандартный ввод, вывод и ошибка подключены к терминалу, соединяя их через
ptybandage
с исходный стандартный ввод, вывод и ошибка.Он имеет дело с нюансами работы под оболочками управления заданиями, гарантируя, что символ STOP терминала не только останавливает,
ptybandage
но и останавливает выполнение программы, присоединенной к внутреннему терминалу.ptyrun
ptyrun
это то, что люди обычно хотят на сетевых серверах TCP. Его основной сценарий использования - это среды удаленного выполнения, в которых сами терминалы не настроены, и запускаются программы, которые не работают должным образом, когда нет терминала.Он не ожидает запуска под оболочкой управления заданиями, и если выполняемая команда получает сигнал остановки, она просто перезапускается.
Доступные наборы инструментов
Дрю Нельсон публикует "pty" версию 4 и "ptyget".
Пол Джарк публикует фиксированную версию ptyget, в которой предпринята попытка обработать специфичные для операционной системы псевдо-терминальные устройства ioctl в оригинале, которые операционные системы фактически больше не предоставляют.
Пакет с исходным кодом nosh поставляется с рабочими файлами
ptybandange
иptyrun
сценариями, которые используютexecline
инструмент Лорана Беркота и собственные команды управления псевдо-терминалом пакета nosh . Начиная с версии nosh 1.23 они доступны предварительно упакованы в пакет nosh-terminal-extras. (Более ранние версии предоставляли их только людям, которые создавали из исходников.)Несколько примеров использования
Юрген Оскам (Jurjgen Oskam), использующий
ptybandage
в AIX для передачи ввода из документа здесь в программу, которая открывается явным образом, и читает свой управляющий терминал для запроса пароля:Энди Брэдфорд использует
ptyrun
OpenBSD под daemontools и ucspi-tcp, чтобы сделатьbgplgsh
интерактивную программу управления маршрутизатором доступной через сеть, заставляя ее думать, что она общается с терминалом:дальнейшее чтение
redo
. Часто задаваемые ответы.bgplgsh
, 8. Страницы руководства OpenBSD.источник
expect
?Вы можете использовать socat, чтобы запустить процесс с подключенным pty , и заставить socat подключить другой конец pty к файлу. Какой AFAIU именно то, что вы спросили:
Этот метод приведет к тому, что
isatty
вызванный методmy-command
вернется,true
и процесс, который полагается только на это, будет одурачен для вывода управляющих кодов. Обратите внимание, что некоторые процессы (в частностиgrep
) также проверяют значениеTERM
переменной среды, поэтому вам может потребоваться установить для нее что-то разумное, например"xterm"
источник
Здесь также есть хорошее решение, опубликованное здесь на Super User от KarlC :
Скомпилируйте небольшую общую библиотеку:
Затем скажите вашей команде, чтобы
isatty(3)
динамически загружать это переопределение:Это может не сработать для каждой команды, может даже неожиданно сломать некоторые, но, вероятно, сработает в большинстве случаев.
источник
DYLD_INSERT_LIBRARIES=./isatty.so DYLD_FORCE_FLAT_NAMESPACE=y mycommand
Как насчет использования
script(1)
?Например:
Сохраните
ls
вывод вout_file
сохраненных цветовых кодах.источник
out_file
с его цветами?less -R
. В этом случае, однако, я хотел, чтобы вывод продолжался в конвейере, который в конечном итоге оказался в моем терминале. Используяcat
для иллюстрации, это было что-то вродеscript -q -c 'ls -G' /dev/null | cat
, который полностью подавляетtypescript
файл, оставляя только вывод программы.-
) в качествеscript
выходного файла, например:script -q -c 'ls -G' -
Основываясь на ответе @ Amir , вот скрипт, который генерирует и затем включает библиотеку во время выполнения:
источник