Escape последовательности в выводе скрипта, вызванного из приложения ncurses

В настоящее время я запускаю mcabber как мой Jabber-клиент (который использует ncurses) в сеансе tmux на моем сервере-хозяине. Локально я запускаю iTerm2 в качестве эмулятора терминала, который поддерживает запуск уведомлений рычания через последовательности escape-символов.

Примечание. Все echo в этом вопросе работают как printf %b или echo -e в bash и echo сигнале GNU.

например, echo "\e]9;foobar\007" заставляет iTerm2 отправлять сообщение Growl с текстом "foobar".

Однако, когда в сеансе tmux escape-последовательности съедают. Поэтому, используя проприетарную escape-последовательность символов \Ptmux можно использовать следующим образом:

 echo "\ePtmux;\e\e]9;foobar\007\e\\" 

Это вызывает сообщение рычания из сеанса tmux.

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

Я полагаю, что это связано с тем, что mcabber запускает скрипт как приложение ncurses, поэтому вывод из моего обычного сценария bash теряется, и iTerm 2 его никогда не видит.

Я также попытался позвонить в smcup без успеха, прежде чем повторять некоторые идеи, которые я обнаружил

 tput smcup echo "\ePtmux;\e\e]9;$FROM: $MSG\007\e\\" tput rmcup 

Я полагаю, что это не работает, так как проблема не возвращается к «реальному оконечному окну», а больше направляет вывод в окне ncurses.

Любые идеи по этому поводу?

4 Solutions collect form web for “Escape последовательности в выводе скрипта, вызванного из приложения ncurses”

Причина, по которой событие-сценарий не отправляет сообщение «growler», заключается в том, что mcabber закрывает стандартные потоки ввода, вывода и ошибок, когда он запускает команду события. Это можно увидеть в hooks.c :

  if ((pid=fork()) == -1) { scr_LogPrint(LPRINT_LOGNORM, "Fork error, cannot launch external command."); g_free(datafname); return; } if (pid == 0) { // child // Close standard file descriptors close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); if (execl(extcmd, extcmd, arg_type, arg_info, bjid, arg_data, (char *)NULL) == -1) { // scr_LogPrint(LPRINT_LOGNORM, "Cannot execute external command."); exit(1); } } g_free(datafname); 

Это заставляет сценарий запуска работать без вмешательства в потоки, используемые mcabber .

Нет специального режима ncurses, который перехватывает сообщение (ведь tmux уже работает как приложение terminfo). Вероятно, вы можете решить проблему, перенаправляя свое echo (предпочтительно printf ) на /dev/tty , например,

 #!/bin/sh printf '\033Ptmux;\033\033]9;foobar\007\033\\' >/dev/tty 

Программы tmux и screen напрямую не проходят через escape-последовательности. Они представляют один вид терминала для приложения (тип экранного терминала) и сами являются приложением ncurses к другому терминалу. По сути, это что-то вроде терминального переводчика. Таким образом, да, он потребляет (или отбрасывает) последовательности для типа экрана «screen» и помещает буфер, который вы видите. Затем он принимает эти события изменения буфера и использует любой тип терминала, который вы используете в настоящее время для отображения текущего буфера. Таким образом, оригинальное приложение и терминал просмотра развязаны.

Если бы вы поставили что-то вроде …

 export "PTTY=$(tty)" 

… в вашем /etc/profile то для каждой новой -l ogin-оболочки, которую вы вызовете (что обычно происходит при открытии нового окна терминала), эта переменная среды будет доступна для всех дочерних процессов, что должно включают tmux и всех его детей.

Это должно помочь вам …

 printf '\033]9;foobar\007' >"$PTTY" 

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

Если проблема в том, что вывод из вашего сценария bash теряется, вы можете выиграть битву с перенаправлением:

echo "\ ePtmux; \ e \ e] 9; foobar \ 007 \ e \"> / dev / tty

Тем не менее, я подозреваю, что реальная проблема заключается в том, что вы должны использовать echo -e чтобы bash обрабатывал escape-последовательности в вашей строке.

  • Как переориентировать панель и сделать ее высотой экрана в tmux?
  • Состояние / Переключение переменных в tmux
  • Почему мои окна выделяются при первом открытии tmux?
  • Перенумерация окон в tmux
  • Как мне увеличить прокрутку окна iterm (tmux) (не прокрутку строки)
  • Остановить прокрутку при остановке колесика
  • Могу ли я применить `tmux` к сценарию bash?
  • Nautilus: открыть папку в терминале при использовании tmux
  • Tmux - Получить количество панелей в текущем окне в переменной bash?
  • Существует ли эквивалент команды «log» GNU Screen в tmux?
  • tmux: backspace и ctrl-backspace отправляют оба ^?
  • Linux и Unix - лучшая ОС в мире.