Я пытаюсь сделать противоположное « Определить, является ли stdin терминалом или каналом? ».
Я запускаю приложение, которое меняет свой формат вывода, потому что оно обнаруживает канал в STDOUT, и я хочу, чтобы оно считало, что это интерактивный терминал, поэтому я получаю тот же вывод при перенаправлении.
Я думал, что обернуть его в expect
сценарий или использовать proc_open()
в PHP, но это не так.
Есть идеи?
Ответы:
Ага!
Команда
script
делает то, что мы хотим ...Делает трюк!
источник
script
даже доступен в BusyBox !less -R
, куда идет ввод с терминалаless -R
, тогда вам понадобится дополнительная хитрость. Например, я хотел красочную версиюgit status | less
. Вам нужно перейти-R
на less для того, чтобы он уважал цвета, и вам нужно использовать,script
чтобы получитьgit status
выходной цвет. Но мы не хотимscript
сохранять владение клавиатурой, мы хотим, чтобы это пошлоless
. Так что я использую это сейчас, и это работает хорошо0<&- script -qfc "git status" /dev/null | less -R
. Эти первые несколько символов закрывают стандартный ввод для этой команды.$-
переменную оболочки для «i».Py_Initialize
что не видел надлежащий stdin / stderr.Основываясь на решении Криса , я предложил следующую маленькую вспомогательную функцию:
Причудливый вид
printf
необходим для правильного расширения аргументов скрипта$@
при защите возможных частей команды, указанных в кавычках (см. Пример ниже).Использование:
Пример:
источник
--return
опцию, если она есть в вашей версииscript
, чтобы сохранить код завершения дочернего процесса.function faketty { script -qfc "$(printf "%q " "$@")" /dev/null; }
противном случае файл с именемtypescript
будет создаваться при каждом запуске команды, во многих случаях.script: illegal option -- f
Сценарий unbuffer, который поставляется с Expect, должен с этим справиться. Если нет, приложение может смотреть на что-то, кроме того, к чему его выход подключен, например. для чего установлена переменная окружения TERM.
источник
Я не знаю, выполнимо ли это из PHP, но если вам действительно нужен дочерний процесс для просмотра TTY, вы можете создать PTY .
В С:
На самом деле у меня сложилось впечатление, что
expect
сам создает PTY.источник
Ссылаясь на предыдущий ответ, в Mac OS X можно использовать «скрипт», как показано ниже ...
Но, поскольку он может заменить "\ n" на "\ r \ n" на stdout, вам также может понадобиться такой скрипт:
Если между этими командами есть какой-то канал, вам нужно сбросить стандартный вывод. например:
источник
Слишком новы, чтобы комментировать конкретный ответ, но я подумал, что буду следить за
faketty
функцией, опубликованной ingomueller-net выше, так как она недавно помогла мне.Я обнаружил, что это создает
typescript
файл, который мне не нужен / не нужен, поэтому я добавил / dev / null в качестве целевого файла скрипта:function faketty { script -qfc "$(printf "%q " "$@")" /dev/null ; }
источник
Обновление ответа @ A-Ron на a) работу как в Linux, так и в MacOs b) косвенное распространение кода состояния (поскольку MacO
script
не поддерживает его)Примеры:
источник
Я пытался получить цвета во время работы
shellcheck <file> | less
, поэтому я попробовал ответы выше, но они производят этот странный эффект, когда текст горизонтально смещен относительно того, где он должен быть:(Для тех, кто не знаком с shellcheck, строка с предупреждением должна совпадать с тем, где проблема.)
Для того, чтобы ответы выше работали с shellcheck, я попробовал один из вариантов из комментариев:
Это работает. Я также добавил
--return
и использовал длинные опции, чтобы сделать эту команду чуть менее непостижимой:Работает в Баш и Зш.
источник
В пример кода книги "Расширенное программирование в среде UNIX, второе издание" включена также pty-программа!
Вот как скомпилировать pty на Mac OS X:
источник