ターミナル エミュレータを起動し、その中で特定のコマンドを実行するスクリプトを作成する必要があります。ターゲット システムにどのターミナル エミュレータがインストールされているかがわからないため、インストールされているターミナル エミュレータを見つけるにはどうすればよいですか?
私は見てきましたこのスレッドただし、ハードコードされたチェックを行うつもりはないので、汎用的なソリューションを探しています。
私はこれを思いついたとても汚いハックですが、これがどうなるかは本当にわかりません。
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.wrapper
xfce4-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
正しい結果が得られるとは限りません。
したがって、最善の戦略は次のようになります。
- ユーザーが設定を指定している場合はそれを使用する
- そうでなければ試してください
xdg-terminal
- そうでなければ試してください
x-terminal-emulator
- それ以外の場合はハードコードされたリストを試してください
答え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