Escape urutan dalam output dari skrip dipanggil dari aplikasi ncurses


14

Saya saat ini menjalankan mcabber sebagai klien Jabber saya (yang menggunakan ncurses) dalam sesi tmux di server saya. Secara lokal saya menjalankan iTerm2 sebagai terminal emulator, yang mendukung pemicu notifikasi growl melalui urutan pelarian karakter.

Catatan: Semua echodalam pertanyaan ini berfungsi seperti printf %b, atau echo -edi bash dan GNU echo.

mis. echo "\e]9;foobar\007"membuat iTerm2 mengirim pesan Growl dengan teks "foobar".

Namun, ketika dalam sesi tmux, urutan melarikan diri dimakan. Oleh karena itu menggunakan urutan pelarian karakter eksklusif \Ptmuxdapat digunakan seperti ini:

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

Ini memicu pesan growl dari dalam sesi tmux.

Namun, ketika saya menggunakan ini dalam skrip acara mcabber saya yang dipecat ketika pesan baru diterima, tidak ada pemberitahuan yang dipicu, seolah-olah gema dikirim ke terminal yang salah.

Saya kira ini ada hubungannya dengan mcabber yang memicu skrip adalah aplikasi ncurses sehingga output dari skrip bash normal saya hilang dan iTerm 2 tidak pernah melihatnya.

Saya juga mencoba menelepon smcup tanpa hasil sebelum menggemakan beberapa ide yang saya temukan

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

Saya kira ini tidak berhasil karena masalahnya tidak beralih kembali ke "jendela terminal nyata", tetapi lebih mengarahkan output di jendela ncurses.

Ada ide tentang ini?

Jawaban:


1

Alasan mengapa skrip peristiwa gagal mengirim pesan "growler" adalah karena mcabbermenutup input standar, output , dan stream kesalahan ketika menjalankan perintah event. Anda dapat melihatnya di 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);

Itu membuat skrip acara berjalan tanpa mengganggu aliran yang digunakan oleh mcabber.

Tidak ada ncurses modus khusus mencegat pesan (setelah semua, tmuxini sudah berjalan sebagai aplikasi terminfo). Anda mungkin dapat mengatasi masalah dengan mengarahkan ulang echo(sebaiknyaprintf ) ke /dev/tty, misalnya,

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

0

Program tmux dan layar tidak secara langsung melewati urutan pelarian. Mereka menghadirkan satu jenis terminal ke aplikasi (tipe terminal layar), dan itu sendiri merupakan aplikasi ncurses ke terminal lain. Efeknya seperti penerjemah terminal. Jadi ya itu mengkonsumsi (atau membuang) urutan untuk tipe terminal "layar", dan memasang buffer yang Anda lihat. Kemudian dibutuhkan peristiwa perubahan buffer dan menggunakan terminal apa pun yang saat ini Anda gunakan untuk menampilkan buffer saat ini. Jadi aplikasi asli dan terminal tampilan dipisahkan.


0

Jika Anda meletakkan sesuatu seperti ...

export "PTTY=$(tty)"

... pada /etc/profilesaat itu untuk setiap -lshell ogin baru yang akan Anda panggil (yang umumnya terjadi ketika Anda membuka jendela terminal baru) bahwa variabel lingkungan akan tersedia untuk semua proses anaknya - yang harus mencakuptmux dan semua anak-anaknya .

Ini seharusnya memungkinkan Anda melakukan ...

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

... dan dengan demikian melompati setiap ptylapisan yang mungkin ada antara shell Anda saat ini dan emulator terminal yang Anda gunakan.


0

Jika masalahnya adalah output dari skrip bash Anda hilang, maka Anda dapat memenangkan pertempuran dengan pengalihan:

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

Namun, saya menduga masalah sebenarnya adalah bahwa Anda harus menggunakan echo -esehingga bash memproses urutan pelarian dalam string Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.