web-dev-qa-db-ja.com

デフォルトのターミナルエミュレータを見つける

現在のデスクトップ環境で使用されているターミナルエミュレータ(xtermgnome-terminal...)をどのように検出しますか? xdg-openと同様ですが、ターミナルエミュレータ用です。

Xubuntuのインストールでxdg-terminalスクリプトを試しましたが、運がありませんでした。

./xdg-terminal.sh: 305: [: x: unexpected operator
./xdg-terminal.sh: 399: [: xxterm: unexpected operator
xdg-terminal: configured terminal program 'xterm' not found or not executable

これはC++プログラムで使用するためのものであるため、任意のスクリプト、パッケージ、または組み込みコマンドで使用できます。

助けてくれてありがとう !

5
natinusala

短い答え

ディストリビューション全体でデフォルトのターミナルエミュレータが何であるかを知るための標準はありません。実際、ユーザーは「デフォルトで」デスクトップ環境に付属しているものとはまったく異なる端末を使用する場合があります。さまざまなシステム変数と構成ファイルを調べることによってのみ、それを推測することができます。

長い答え

あなたは$TERMであなたの前進を推測することを試みることができます

man term.5および/またはman term.7(マニュアルページの5ページと7ページ)を参照してください。

通常、環境変数TERMには、使用している端末、コンソール、またはディスプレイデバイスタイプのタイプ名が含まれている必要があります。この情報は、エディターやメーラーを含むすべての画面指向プログラムにとって重要です。

デフォルトのTERM値は、/ etc/inittab(LinuxおよびSystem-VのようなUNIX)または/ etc/ttys(BSD UNIX)のいずれかによって行ごとに設定されます。これは、ワークステーションおよびマイクロコンピューターコンソールではほとんどの場合十分です。

私のManjaroi3インストールで

$ echo $TERM
rxvt-unicode-256color

これはurxvtの別名です。したがって、デフォルトの端末の正しい名前を取得することさえ期待できません。

詳細に この返信で

$ TERMに[認識できないもの]がある場合は、次のような構成を注意深く確認してください。

  • / etc/inittabのagetty行(end1でlinuxと言う必要があります)
    • システム全体のシェル起動スクリプト
      • /etc/profile、/etc/profile.d/*.sh
      • /etc/bash.bashrc(bashを使用している場合)
    • 独自のシェル起動スクリプト
      • 〜/ .profile、〜/ .bash_profile、〜/ .bash_login、〜/ .bashrc

アドバイス:既知のターミナルエミュレーターのリストを確認するだけです

デフォルトでは、i3にはi3-sensible-terminalが付属しています。マニュアルによると

i3-sensible-terminalは、端末を起動するためにi3のデフォルト設定で呼び出されます。ディストリビューションに依存しないターミナルランチャーがないため、このラッパースクリプトが必要です(ただし、たとえば、Debianにはx-terminal-emulatorがあります)。配布パッケージャーは、配布に適した方法でこのスクリプトを出荷する責任があります。

そして、それが機能する方法は、一般的に使用されるターミナルエミュレーターのリストを調べるだけです。

次のいずれかを(この順序で)開始しようとします。

  • $ TERMINAL(これは非標準変数です)
  • x-terminal-emulator(Debianおよび派生物にのみ存在)
  • urxvt
  • rxvt
  • シロアリ
  • ターミネーター
  • .。

どこ

  • $TERMINALは通常、使用時に前述の起動スクリプトで設定されます。
  • x-terminal-emulatorは、デフォルトのターミナルを要求するDebianの方法です(Ubuntuで動作します)

Bashスクリプトでは、それは次の行に沿って何かを与えるでしょう

terms=(emulator1 emulator2 emulator3)
for t in ${terms[*]}
do
    if [ $(command -v $t) ]
    then
        detected_term=$t
        break
    fi
done
echo $detected_term
1
AlexLoss