ncursesアプリケーションから呼び出されるスクリプト出力のエスケープシーケンス

ncursesアプリケーションから呼び出されるスクリプト出力のエスケープシーケンス

私は現在、ホームサーバーのtmuxセッションでJabberクライアント(ncursesを使用)でmcabberを実行しています。ローカルでは、文字エスケープシーケンスを介してうるさい通知トリガーをサポートする端末エミュレータとしてiTerm2を実行しています。

注:この質問のすべてはbashとGNUにecho似ています。printf %becho -eecho

たとえば、echo "\e]9;foobar\007"iTerm2に「foobar」というテキストを含むGrowlメッセージを送信させます。

しかし、tmuxセッション内ではエスケープシーケンスが使い果たされます。したがって、\Ptmux独自の文字エスケープシーケンスは次のように使用できます。

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

これにより、tmuxセッションでハウリングメッセージがトリガーされます。

ただし、新しいメッセージが受信されたときに実行されるmcabberイベントスクリプトでこれを使用すると、エコーが誤った端末に送信されるかのように通知は実行されません。

私はこれがncursesアプリケーションであるスクリプトをトリガーするmcabberに関連していると思うので、通常のbashスクリプトの出力が失われ、iTerm 2はこれを見ることができません。

私はまた、私が見つけたいくつかのアイデアに基づいてエコーする前に成功しなかったsmcupを呼び出してみました。

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

問題は、「実際の端末ウィンドウ」に戻すのではなく、ncursesウィンドウから出力をさらに指示するので、これはうまくいかないと思います。

これについて考えていますか?

ベストアンサー1

イベントスクリプトが "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

おすすめ記事