私は現在、ホームサーバーのtmuxセッションでJabberクライアント(ncursesを使用)でmcabberを実行しています。ローカルでは、文字エスケープシーケンスを介してうるさい通知トリガーをサポートする端末エミュレータとしてiTerm2を実行しています。
注:この質問のすべてはbashとGNUにecho
似ています。printf %b
echo -e
echo
たとえば、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