インストールされている端末エミュレータがわからない状態で端末エミュレータを起動する

インストールされている端末エミュレータがわからない状態で端末エミュレータを起動する

ターミナル エミュレータを起動し、その中で特定のコマンドを実行するスクリプトを作成する必要があります。ターゲット システムにどのターミナル エミュレータがインストールされているかがわからないため、インストールされているターミナル エミュレータを見つけるにはどうすればよいですか?

私は見てきましたこのスレッドただし、ハードコードされたチェックを行うつもりはないので、汎用的なソリューションを探しています。

私はこれを思いついたとても汚いハックですが、これがどうなるかは本当にわかりません。

termdetect:

#!/bin/bash

IFS=:
for i in $PATH; do
  find "$i" -type f -exec isterminal {} \;
done

isterminal:

#!/bin/bash

if [[ ! -z "$1" ]]; then
  if [[ "$(head -c 4 "$1")" == $'\x7fELF' ]]; then
    if ! grep editor "$1" > /dev/null; then
      if grep -E '(vte_terminal_|libutempter|rxvt_)' "$1" > /dev/null; then
        echo "$1"
      fi
    fi
  fi
fi

私が見逃している簡単な汎用的な解決策はありますか? それとも、バイナリを調べてヒントを探すか、ハードコードされたリストを使用する以外に方法はないのでしょうか?

答え1

あなたのヒューリスティックはかなり悪いです。これが私の Debian wheezy マシンで見つかったものです (正しいヒットには手動で でマークしました+)。

/usr/bin/gcm-calibrate
/usr/bin/gnome-terminal        +
/usr/bin/mosh-client   
/usr/bin/mosh-server
/usr/bin/mrxvt                 +
/usr/bin/mrxvt-full            +
/usr/bin/roxterm               +
/usr/bin/rxvt-unicode          +
/usr/bin/urxvt                 +
/usr/bin/urxvtd
/usr/bin/vinagre
/usr/bin/x-terminal-emulator   +
/usr/bin/xfce4-terminal        +
/usr/bin/xterm                 +

最初のアルファベットの一致を選択すると、それはカラーキャリブレーターになります。

x-terminal-emulator以下は、この Debian マシン上での正解 (ディストリビューション管理プログラムに関する限り) であるの代替案のリストです。

/usr/bin/Eterm
/usr/bin/gnome-terminal.wrapper
/usr/bin/koi8rxterm
/usr/bin/konsole
/usr/bin/lxterm
/usr/bin/mlterm
/usr/bin/mrxvt-full
/usr/bin/roxterm
/usr/bin/rxvt-xpm
/usr/bin/rxvt-xterm
/usr/bin/urxvt
/usr/bin/uxterm
/usr/bin/xfce4-terminal.wrapper
/usr/bin/xterm
/usr/bin/xvt

15 個中 7 個が見つかりました (名前の不規則性を考慮すると)。ヒット率はそれほど高くありません。

ヒューリスティックを改良することもできますが、それは終わりのないゲームです。最低限、X11 ライブラリにリンクし、getptまたはなどのマスター ターミナル関数またはユーティリティを呼び出す実行可能ファイルのみを保持することになりますgrantptが、これでは多くの誤った陽性も検出され、呼び出しがライブラリ内 (など) にある実行可能ファイルが見逃されることになりますkonsole。また、シェル ラッパーを介してアクセスされるネイティブ コード実行可能ファイルも見逃されます (私のリストにはいくつかあります)。

実行可能ファイルの内容からプログラムが X 端末エミュレーターであるかどうかを検出することは不可能です。

名前でプログラムを検出する方がはるかに優れたヒューリスティックです。

プログラムによってコマンドライン構文が異なることにも注意してください。ほとんどのプログラムはと を受け入れますが、 の解析ルールは異なります(シェルを経由するかどうか、複数の引数を取るかどうか)。そのため、 の後に、シェルの特殊文字を含まない単一のパラメータを渡す必要があります。-T TITLE-e COMMAND-e-e

Debianとその派生版では、x-terminal-emulator-Tは、とをサポートする X 端末エミュレータであることが保証されています-e。 は、-e後続のすべてのコマンドラインパラメータをコマンドとその引数として使用し、それらに対してシェル展開を行いません。エミュレータによっては動作が異なるため、は、より xterm に似た構文 (と はその一例です)x-terminal-emulatorを取るラッパーである場合があります。gnome-terminal.wrapperxfce4-terminal.wrapper

他の UNIX 系 OS ではこのようなことは知りません。移植性などを考えると、プログラム名のリストをハードコードするのが最善策です。

さらに、インストールされているターミナル エミュレーターを検出しても、ユーザーの好みについてはまったくわかりません。たとえば、Gnome を使用している場合、アプリケーションで Konsole を起動することはおそらく望ましくありません。たまたま Konsole を好んでいる場合を除きますが、どうすればそれがわかるのでしょうか。

ユーザーの好みに関する事実上の標準は、フリーデスクトップ仕様。 Freedesktopはxdg-utils次のようなプログラムを含むパッケージxdg-open適切なアプリケーションで文書を開くには、xdg-emailユーザーが好むメール作成アプリケーションを起動し、さらにxdg-terminalユーザーが好むターミナルエミュレーターを開きます。

これは正しい使い方でありxdg-terminal、存在する場合は使用すべきです。残念ながら、xdg-terminalどこでも利用できるわけではありません。たとえば、Debianでは提供されていません(これは長時間放置されたバグ)。 さらにxdg-terminal単一のコマンド引数を許可しますが、この引数がどのような展開を受けるかについては一貫性がありません。

何をするにしても、発信者が好みを簡単に指定できる方法を提供するようにしてください。必ずしもxdg-terminal正しい結果が得られるとは限りません。

したがって、最善の戦略は次のようになります。

  1. ユーザーが設定を指定している場合はそれを使用する
  2. そうでなければ試してくださいxdg-terminal
  3. そうでなければ試してくださいx-terminal-emulator
  4. それ以外の場合はハードコードされたリストを試してください

答え2

Debian および派生版 (Ubuntu、Mint など) では、x-terminal-emulator常に管理者のデフォルトのグラフィカル ターミナルを起動します。
グラフィカル セッションかどうかを判断するために、次のようなものを含めることもできます。

if [ -z "$XAUTHORITY" ]
then 
 echo "Failed to launch terminal emulator! This is not a graphical session."
else
 x-terminal-emulator
fi

関連情報