端末エミュレータを起動し、その中で特定のコマンドを実行するスクリプトを作成する必要があります。ターゲットシステムにどの端末エミュレータがインストールされているのかわからないので、どの端末エミュレータがインストールされているかどうかはどうすればわかりますか?
私は見たことがないこのスレッド。しかし、ハードコーディングチェックが不便で、一般的な解決策を探しています。
こんな思いをしてみた非常に汚いハッキングですが、これがどのように機能するのかわかりません。
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
-e
x-terminal-emulator
gnome-terminal.wrapper
xfce4-terminal.wrapper
私は他のUNIXの亜種と同様の状況を知りません。移植性などの場合は、ハードコードされたプログラム名のリストが最適です。
また、インストールされている端末エミュレータを検索しても、ユーザー設定のアイデアは提供されません。たとえば、私が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