從 ncurses 應用程式呼叫的腳本輸出中的轉義序列

從 ncurses 應用程式呼叫的腳本輸出中的轉義序列

我目前正在我的家庭伺服器上的 tmux 會話中運行 mcabber 作為我的 Jabber 客戶端(使用 ncurses)。在本地,我將 iTerm2 作為終端模擬器運行,它支援透過字元轉義序列觸發咆哮通知。

注意:echo這個問題中的所有內容都類似於bash 和 GNU 中的printf %b, or 。echo -eecho

例如,echo "\e]9;foobar\007"讓 iTerm2 發送一條帶有文字「foobar」的 Growl 訊息。

然而,在 tmux 會話中,轉義序列會被耗盡。因此,\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 視窗中引導輸出。

對這個有什麼想法嗎?

答案1

事件腳本無法發送“咆哮者”訊息的原因是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

答案2

tmux 和 screen 程式不會直接通過轉義序列。它們向應用程式提供一種終端(螢幕終端類型),並且本身就是另一個終端的 ncurses 應用程式。實際上,它有點像終端翻譯器。所以是的,它消耗(或丟棄)“螢幕”終端類型的序列,並建立一個您看到的緩衝區。然後它會獲取這些緩衝區更改事件並使用您目前使用的任何類型的終端來顯示當前緩衝區。所以原來的app和檢視端是解耦的。

答案3

如果你要放一些像...

export "PTTY=$(tty)"

....在您的/etc/profilethen中-l,您將呼叫每個新的 ogin shell(當您開啟新的終端機視窗時通常會發生這種情況)此環境變數將可供其所有子進程使用 - 其中應包括tmux及其所有子進程。

這應該使您能夠...

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

...從而直接跳過pty當前 shell 和您正在使用的終端模擬器之間可能存在的任何層。

答案4

如果問題是 bash 腳本的輸出遺失,那麼您可以透過重定向贏得戰鬥:

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

但是,我懷疑真正的問題是您應該使用echo -ebash 來處理字串中的轉義序列。

相關內容