tmux
または、同じウィンドウで複数の端末ウィンドウを開くことができるスクリプトを作成したいと思いますscreen
。
私は個人的にこの分野で非常に巧みで長年tmux
使用してきましたが、私たちのチームの他の開発者は、この分野や他のスクリーンマルチプレクサについて何も知りたくありません。
この目的のために、単一のウィンドウの複数のウィンドウから独自に分離できるスクリプトを作成したいと思います。 bashで直接達成できますか?
私の目標は
node
インストールが必要な場合やインストールが必要なものは避けてください(例:貢献への祝福)プロセスをできるだけ簡単にします。- ほとんどのディストリビューションにプリインストールされ、posixと互換性のあるものを使用して作成します。
- 複数のウィンドウに分かれたターミナルウィンドウがあり、各ウィンドウは実行中のプロセスまたはコマンドプロンプトにすることができます。
- 誰かをクリックすると、
ctrl+c
すべてのウィンドウを終了して単一の端末に戻ります。
答え1
私はこれがbashだけではできないと言うのは安全だと思います。より高いレベルのプログラミング言語(Perl / Pythonなど)が必要な場合、またはスクリプトを使用してtmuxインスタンスを制御する必要があります。
関連技術の簡単なレビューは次のとおりです。
- 目的の端末環境でプログラムを実行するには擬似端末(pty)それをホストします。
- pty はシステムコールを使用して生成および制御されます。I/W制御、かなり低いレベルのAPIを持っています。
- tmuxなどの操作を実行するには、各ptyの制御端を常に読み取る必要があります。ターミナルエスケープコード
- ターミナル機能には数百のバリエーションがあります(例えば、カーソルの位置決めや太字/色/下線などのためにターミナルがサポートするエスケープシーケンス)。したがって、ある種の互換性が必要な場合は、同様のライブラリを使用する必要があります。呪い子ウィンドウを設定するのに役立ちます。
Bashを許可するツールがありますioctlを呼び出すしかし、私はそれがpty割り当てに必要なすべての呼び出しを処理できるとは思わず、いかなる意味でも標準的なツールではありません。
次の方法でこの問題を解決できます。手動でptyデバイスノードを作成するしかし、rootとして実行する必要があるため、混乱する可能性があります。
bashはコマンドからさまざまなターミナルエスケープシーケンスを見つけることができ、tput
実際にテキストウィンドウをレンダリングするbashスクリプトを書くことができますが、ncursesがなければ、クロスプラットフォームで正しく実行するのは困難で時間がかかります。
簡単に言えば、一般的なbashツールとposixツールを使用するとこれを行うことはできません。
PerlはほとんどすべてのUNIXにインストールされており、Perlをioctl
呼び出すことができるので、別のモジュールをインストールせずにPerlで書くことができます。ただし、少なくとも追加のヘルパーモジュール(例:IO::Ptyそして呪い。しかし、それにもかかわらず、まだやるべきことがたくさんあります。
私の考えに最適な方法は試してみることです。スクリプトを食べる。これまでこれをやったことはありませんが、その投稿は数週間と多くの学習ではなく、数日のプロジェクトのように見えます。
主な反対意見がtmuxをインストールする必要があるということであれば、tmuxの静的バイナリをダウンロードしてコンパイルし、スクリプトと一緒に配布することができます。静的バイナリは、システム内のすべてのライブラリへの依存関係を避け、正しいアーキテクチャを備えた最新のLinuxカーネルで実行する必要があります。複数のアーキテクチャのバイナリをコンパイルし、スクリプトが使用するバイナリを検出できるようにすることもできます。