テキストファイルを書き出してエディターで開くスクリプトを実行しています。デスクトップセッションでターミナルエミュレータウィンドウを開いてスクリプトを実行する場合、エディターをgedit
などのグラフィカルなものにしたいと思います。ただし、自分の携帯電話などでConnectBotを介してログインしている場合(デスクトップセッションなし)、エディターをnano
にしたいと思います。
現在、私は最後のステップを除いて同一の2つの異なるスクリプトを維持する必要があります(またはグラフィカルなスクリプトを実行し、エラーをオフにして、nano
でファイルを手動で開きます)。ほぼ同一の2つのスクリプトを持つことは、メンテナンスの観点からは非効率的です。
スクリプトは、私がこれらの状況のどれであるかを検出し、正しいエディターを開くことができますか?
(スクリプトがターミナルエミュレータウィンドウで実行されているか、ダブルクリックされたかを検出する方法を見つけましたが、ウィンドウがデスクトップで実行されているかどうかを検出する方法はまだ見つかりません... Googleの正しい用語を知っている)
環境変数$DISPLAY
をif
条件内のトリガーとして使用できます。通常、この変数に値がある場合、グラフィカルアプリケーションを実行できます。
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
によって処理されます。
参照:
通常、仮想端末は /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 ;;
などの追加のテストを行うことです。
これは私が使用しているものです:
# $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