Jak skrypt wykrywa, czy emulator terminala działa w sesji pulpitu, czy nie?

10

Mam uruchomione skrypty, które zapisują plik tekstowy, a następnie otwierają go w edytorze. Jeśli otworzę okno emulatora terminala w sesji pulpitu i uruchomię skrypt, chciałbym, aby edytor był graficznym, takim jak gedit. Ale jeśli jestem zalogowany przez ConnectBot na telefonie lub podobnym urządzeniu (bez sesji na komputerze), chciałbym, aby edytor był nano.

Obecnie muszę utrzymywać 2 różne skrypty, identyczne z wyjątkiem ostatniego kroku (lub pozwolić graficznemu uruchomić, wyłączyć błąd, a następnie ręcznie otworzyć plik nano). Posiadanie dwóch w większości identycznych skryptów jest nieefektywne z punktu widzenia konserwacji.

Czy skrypt może wykryć, w której z tych sytuacji jestem, i otworzyć odpowiedni edytor?

(Znalazłem sposoby na wykrycie przez skrypt, czy działa on w oknie emulatora terminala, czy poprzez podwójne kliknięcie, ale jeszcze nie znalazłem sposobu na wykrycie, czy okno działa na pulpicie ... Nie sądzę znać poprawną terminologię wyszukiwarki Google)

Marmur Organiczny
źródło
6
Jeśli twój skrypt jest przeznaczony do użytku przez inne osoby, powinieneś użyć programu określonego $EDITORdomyślnie zamiast nanoi powrócić do nanoniego, jeśli nie jest ustawiony.
Bakuriu
Dzięki, świetna rada i wspaniale jest usłyszeć, co jest dobrą praktyką. Tylko ja.
Marmur Organiczny

Odpowiedzi:

13

Możesz użyć zmiennej środowiskowej $DISPLAYjako wyzwalacza w ramach ifwarunku. Zwykle, gdy ta zmienna ma wartość, możesz uruchamiać aplikacje graficzne.

Oto przykład :

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

Operator -zzwróci wartość true, gdy envvar $DISPLAYbędzie pusty, a skrypt zostanie uruchomiony nano, we wszystkich innych przypadkach zostanie uruchomiony gedit.


Zgodnie z tym komentarzem @ vurp0 :

Na większości współczesnych komputerów Wayland (takich jak domyślny pulpit w Fedorze i Ubuntu), $DISPLAYwciąż jest ustawiony ze względu na kompatybilność wsteczną (przez XWayland), ale dla bardziej niezawodnego skryptu dobrze byłoby przetestować oba $DISPLAYi $WAYLAND_DISPLAYdla pewności.

Sugerowałbym zmodyfikować wyrażenie testowe w następujący sposób:

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

Zatem wartości dwóch zmiennych zostaną połączone w jeden ciąg, który zostanie przetworzony przez operatora -z.


Bibliografia:

pa4080
źródło
1
Lub dla wyraźnej logiki:[[ -z ${DISPLAY} && -z ${WAYLAND_DISPLAY} ]]
Wstrzymano do odwołania.
7

Zwykle terminale wirtualne używają /dev/ptspseudoterminalów . Opierając się na danych wyjściowych ttypolecenia, możemy zbudować prostą caseinstrukcję do obsługi otwierania konkretnego edytora:

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

Lub ładniej sformatowany:

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

W porównaniu do używania zmiennych środowiskowych jest to nieco bardziej niezawodne, a biorąc pod uwagę, że używa caseinstrukcji z ttypoleceniami nieco bardziej przenośnymi. Prawdopodobnie najlepszym rozwiązaniem byłoby połączenie obu z dodatkowymi testami, takimi jak"/dev/tty"*) [ -n "$DISPLAY" ] && gedit ;;

Sergiy Kolodyazhnyy
źródło
Czy to nie jest źle? Na mojej Ctrl + Alt + F1 konsola ttydaje /dev/tty1, podczas gdy gnome-terminal(pierwsza karta) daje /dev/pts/0.
Paddy Landau
@PaddyLandau Tak, geditpowinno być na /dev/pts*wszelki wypadek. Zamieniłem je podczas testowania błędów w tty i skończyłem kopiowanie go tutaj bez przełączania z powrotem. Dzięki, już edytowane.
Sergiy Kolodyazhnyy
3

Właśnie tego używałem:

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

Przyczyną tego kodu było następujące pytanie: Skrót pulpitu do skryptu Bash ulega awarii i wypaleniu

Możesz go zmodyfikować, aby wyglądał następująco:

# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
    nano ...
else
    gedit ...
fi
WinEunuuchs2Unix
źródło