Komut dosyası çıktısında ncurses uygulamasından çağrılan kaçış dizileri


14

Şu anda ev sunucumda bir tmux oturumunda mcber'i (ncurses kullanan) Jabber istemcim olarak çalıştırıyorum. Yerel olarak iTerm2'yi karakter kaçış dizileri aracılığıyla hırıltı bildirimlerinin tetiklenmesini destekleyen bir terminal emülatörü olarak çalıştırıyorum.

Not: echoBu sorudaki tüm gibi printf %bveya echo -ebash ve GNU'da çalışır echo.

örneğin echo "\e]9;foobar\007"iTerm2'nin "foobar" metniyle bir Growl mesajı göndermesini sağlar.

Bununla birlikte, bir tmux seansında, kaçış dizileri yenilir. Bu nedenle, tescilli karakter kaçış dizisinin \Ptmuxkullanılması şu şekilde kullanılabilir:

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

Bu, bir tmux oturumu içindeki bir hırıltı mesajını tetikler.

Ancak, yeni bir mesaj alındığında tetiklenen mcabber olay betiğimde bunu kullandığımda, yankı yanlış terminale gönderiliyormuş gibi hiçbir bildirim tetiklenmez.

Bu betiğin bir ncurses uygulaması tetikleyen mcabber ile yapmak zorundayım, bu yüzden normal bash betiğimin çıktısı kaybolur ve iTerm 2 asla görmez.

Ayrıca keşfettiğim bazı fikirlere cevap vermeden önce başarılı olmadan akıllı telefon aramayı denedim

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

Sorun "gerçek terminal penceresine" geri dönmüyor, ancak daha ncurses penceresinde çıktıyı yönlendiriyor gibi bu işe yaramazsa varsayalım.

Bu konuda bir fikrin var mı?

Yanıtlar:


1

Bir olay betiğinin "yetiştirici" mesajı göndermemesinin nedeni , bir olay komutu çalıştırıldığında mcabberstandart girdi, çıktı ve hata akışlarını kapatmasıdır . Bunu şurada görebilirsiniz 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);

Bu, olay komut dosyasının kullandığı akışlara müdahale etmeden çalışmasını sağlar mcabber.

İletiyi engelleyen özel bir ncurses modu yoktur (sonuçta tmux, zaten bir terminfo uygulaması olarak çalışıyor). Muhtemelen echo(tercihen printf) /dev/tty, örneğin,

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

0

Tmux ve ekran programları doğrudan kaçış dizilerinden geçmez. Uygulamaya bir tür terminal sunarlar (ekran terminal tipi) ve kendisi de başka bir terminale bir ncurses uygulamasıdır. Aslında bir terminal çevirmeni gibi bir şey. Yani evet, bir "ekran" terminal tipi için dizileri tüketir (ya da atar) ve gördüğünüz bir tamponu koyar. Daha sonra bu arabellek değiştirme olaylarını alır ve geçerli arabelleği görüntülemek için şu anda kullandığınız her türlü terminali kullanır. Böylece orijinal uygulama ve görüntüleme terminali birbirinden ayrılmıştır.


0

Eğer şöyle bir şey koysan ...

export "PTTY=$(tty)"

... /etc/profileo zaman her yeni -login kabuğu için (genellikle yeni bir terminal penceresi açtığınızda olan şey budur) , ortam değişkeninin tüm alt süreçleri için kullanılabilir olmasını tmuxve tüm çocuklarını içermesini sağlarsınız. .

Bu, ...

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

... ve böylece ptymevcut kabuğunuz ile kullandığınız terminal öykünücüsü arasında olabilecek katmanlardan sağa atlayın .


0

Sorun, bash betiğinizin çıktısının kaybolmasıysa, yeniden yönlendirme ile savaşı kazanabilirsiniz:

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

Ancak, asıl sorunun şudur ki echo -e, bash dizenizdeki kaçış dizilerini işler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.