インストールされている端末エミュレータがわからず、端末エミュレータの実行

インストールされている端末エミュレータがわからず、端末エミュレータの実行

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

私は見たことがないこのスレッド。しかし、ハードコーディングチェックが不便で、一般的な解決策を探しています。

こんな思いをしてみた非常に汚いハッキングですが、これがどのように機能するのかわかりません。

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コンピュータで彼らが見つけたものは次のとおりです(正しいヒット項目を手動でマークしました+)。

/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                 +

最初の文字マッチングを選択するとカラーキャリブレータです。

以下は、この Debian マシンの正解である代替リストですx-terminal-emulator(配布版管理プログラムに関する限り):

/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コマンドとそのパラメータのすべての後続のコマンドライン引数を使用し、それをシェル拡張しないXターミナル-Tエミュレータでサポートされることが保証されています。一部のエミュレータは動作が異なるため、xtermに似た構文を使用するラッパーがあります(これは2つの例です)。-e-ex-terminal-emulatorgnome-terminal.wrapperxfce4-terminal.wrapper

私は他のUNIXの亜種と同様の状況を知りません。移植性などの場合は、ハードコードされたプログラム名のリストが最適です。

また、インストールされている端末エミュレータを検索しても、ユーザー設定のアイデアは提供されません。たとえば、私が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

関連情報