web-dev-qa-db-ja.com

ターミナルエミュレータがデスクトップセッションで実行されているかどうかをスクリプトで検出する方法は?

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

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

スクリプトは、私がこれらの状況のどれであるかを検出し、正しいエディターを開くことができますか?

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

10
Organic Marble

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

bash の例を次に示します。

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

演算子-zは、envvar $DISPLAYが空で、スクリプトがnanoを実行するときにtrueを返し、その他の場合はgeditを実行します。


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

ほとんどの最近のWaylandデスクトップ(FedoraやUbuntuのデフォルトデスクトップなど)では、$DISPLAYは下位互換性のため(XWaylandを介して)設定されていますが、より堅牢なスクリプトの場合は$DISPLAYおよび$WAYLAND_DISPLAY確認してください。

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

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

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


参照:

13
pa4080

通常、仮想端末は /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 ;;などの追加のテストを行うことです。

7

これは私が使用しているものです:

# $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
3