端末エミュレータがデスクトップセッションで実行されているかどうかをスクリプトで検出するにはどうすればよいですか?


10

テキストファイルを書き込み、それをエディターで開くスクリプトを実行しています。デスクトップセッションでターミナルエミュレータウィンドウを開いてスクリプトを実行する場合、エディタをのようなグラフィカルなものにしたいと思いgeditます。しかし、携帯電話または同様のもの(デスクトップセッションなし)でConnectBotを介してログインしている場合は、エディターをにしてくださいnano

現在、私は2つの異なるスクリプトを維持する必要がありますが、最後のステップを除いて同じです(または、グラフィカルスクリプトを実行してエラーをオフにしてから、手動でファイルを開きますnano)。ほとんど同じスクリプトを2つ持つことは、メンテナンスの観点から非効率的です。

スクリプトは、現在の状況を検出して正しいエディターを開くことができますか?

(スクリプトがターミナルエミュレータウィンドウで実行されているか、ダブルクリックされているかを検出する方法を見つけましたが、ウィンドウがデスクトップで実行されているかどうかを検出する方法はまだ見つかりません...グーグルする正しい用語を知っている)


6
スクリプトが他の人が使用するものである場合、$EDITORデフォルトではの代わりに指定されたプログラムを使用し、設定されていない場合はnanoフォールバックするnano必要があります。
バクリウ

ありがとう、素晴らしいアドバイス、そして良い実践とは何かを聞くのは素晴らしいことです。私だけでも。
オーガニック大理石、

回答:


13

条件$DISPLAY内のトリガーとして環境変数を使用できますif。通常、この変数に値がある場合、グラフィカルアプリケーションを実行できます。

これが例です:

if [[ -z $DISPLAY ]]
then
    nano
else
    gedit
fi

オペレーター-zは、envvar $DISPLAYが空でスクリプトが実行されるとtrueを返します。nanoそれ以外の場合はすべて実行されますgedit


@ vurp0のこのコメントによると:

最も近代的なウェイランドは(FedoraとUbuntuのでは、デフォルトのデスクトップのような)デスクトップ上で、$DISPLAYまだ原因(XWaylandを介して)後方互換性に設定されているが、より堅牢なスクリプトのためには、両方のためのテストには良いだろう$DISPLAY$WAYLAND_DISPLAY確認します。

次の方法でテスト式を変更することをお勧めします。

[[ -z ${DISPLAY}${WAYLAND_DISPLAY} ]]

したがって、2つの変数の値は共通の文字列に連結され、演算子によって処理され-zます。


参照:


1
または明示的なロジックの場合:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
追って通知があるまで一時停止します。

7

通常、仮想端末は/dev/pts疑似端末を使用します。したがって、ttyコマンドの出力に基づいて、case特定のエディターを開くことを処理する簡単なステートメントを作成できます。

case "$(tty)" in ; "/dev/pts"*) nano ;; "/dev/tty"*) gedit ;; ;esac

またはよりきれいにフォーマット:

case "$(tty)" in
    "/dev/pts"*) gedit ;; 
    "/dev/tty"*) nano ;;
    *) echo "Not suitable tty" > /dev/stderr ;;
esac

環境変数を使用する場合と比較すると、これは少し信頼性が高く、コマンドcase付きのステートメントを使用することを考えるとtty、移植性が少し高くなります。おそらく最も良いのは、両方を組み合わせて、次のような追加のテストを行うことです。"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;


これは間違った方法ではありませんか?私のCtrl + Alt + F1コンソールでtty/dev/tty1、を与えますが、gnome-terminal(最初のタブ)はを与え/dev/pts/0ます。
Paddy Landau、

@PaddyLandauはい、geditであるべき/dev/pts*場合。ttyでのエラーテスト中にそれらを切り替えて、元に戻さずにここにコピーしました。ありがとう、すでに編集されています。
Sergiy Kolodyazhnyy

3

これは私が使ってきたものです:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
    exit 1
fi

このコードの理由はこの質問でした:Bashスクリプトへのデスクトップショートカットがクラッシュして書き込みます

次のように変更できます。

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.