Bash

如何編寫創建多個終端窗格的腳本,如 tmux?

  • October 29, 2019

我想編寫一些腳本,可以在一個視窗中打開多個終端窗格,很像tmuxor screen

我個人非常精通tmux,並且已經使用了多年,但我們團隊中的其他開發人員不想知道任何關於它或其他螢幕多路復用器的資訊。

為此,我想編寫可以在單個視窗的多個窗格中劃分自己的腳本。這可以直接使用 bash 嗎?

我的目標是

  • 避免要求node或需要安裝的東西(如blessed-contrib),以使過程盡可能簡單。
  • 使用大多數發行版上預裝的東西編寫它,並且與 posix 兼容。
  • 有一個終端視窗,它被分成多個窗格,其中每個窗格都可以是一個正在執行的程序或命令提示符。
  • 當有人點擊ctrl+c它時,它會退出所有窗格,並返回到單個終端。

我認為可以肯定地說,僅靠 bash 不能做到這一點。您要麼需要更高等的程式語言,例如 perl/python,要麼需要使用腳本控制 tmux 實例。

以下是對所涉及技術的快速回顧:

  • 為了在期望的終端環境中執行程序,您需要創建一個偽終端 (pty)來託管它。
  • ptys 是使用ioctl之類的系統呼叫創建和控制的,並且具有相當低級的 API。
  • 要執行 tmux 之類的操作,您需要不斷讀取每個 pty 的控制端,然後使用特殊的終端轉義碼將這些部分拼接到主程序的終端上
  • 終端功能(即終端支持的用於游標定位和粗體/顏色/下劃線等的轉義序列)有數百種變化,所以如果你想要任何類型的兼容性,你會想要使用像ncurses這樣的庫來幫助你設置子視窗。

有一些工具可以讓 bash呼叫 ioctl,但我認為它不能處理 pty 分配所需的所有呼叫,而且它也不是標準工具。

您可能可以通過手動創建 pty 設備節點來解決這個問題,但您需要以 root 身份執行,這將是一團糟。

bash 可以從命令中找出各種終端轉義序列tput,實際上您可以編寫渲染文本視窗的 bash 腳本,但是如果沒有 ncurses,這很難正確執行和跨平台,並且會花費大量時間。

簡而言之,我認為您無法使用普通的 bash 和 posix 工具來解決這個問題。

Perl 安裝在幾乎所有的 unix 上,並且 perl 可以進行ioctl呼叫,所以是的,即使不安裝任何額外的模組,也應該可以在 perl 中編寫它。但是,我再次希望至少不使用一些額外的幫助模組(如IO::PtyCurses )會花費太長時間。但即使有了這一切,還有很多工作要做。

我認為您最好的選擇是嘗試編寫 tmux 腳本。我以前沒有做過,但那篇文章看起來像是幾天的項目,而不是幾周和大量的學習項目。

如果您的主要反對意見是必須安裝 tmux,您可以嘗試下載並編譯 tmux 的靜態二進製文件,然後將其與您的腳本一起分發。靜態二進製文件避免了對系統中任何庫的依賴,並且應該可以在任何具有正確架構的現代 Linux 核心上執行。您甚至可以為多種架構編譯二進製文件,然後讓腳本檢測要使用的二進製文件。

引用自:https://unix.stackexchange.com/questions/548713