I nie mów „ $TERM
” - zawsze tak jest xterm
.
W jaki sposób bash
skrypt może stwierdzić, w którym terminalu działa, a konkretnie czy jest to iTerm, Terminal.app, czy faktycznie xterm?
Pytam, ponieważ reset
nie działa¹ po wyjęciu z pudełka w Terminal.app i iTerm2. Jednak iTerm2 rozpoznaje sekwencję ucieczki podczas resetowania terminala ( \x1b]50;ClearScrollback\x07
), a gdybym mógł ją wykryć, mógłbym zastąpić reset
ją aliasem, który robi to dobrze. AFAICT, Terminal.app nie ma sekwencji resetowania, a ludzie uciekają się do absurdalnego hakowania tomów, aby włamać się do tego .
Moim ostatecznym celem jest, aby reset
praca była taka sama, niezależnie od tego, czy pracuję na OS X, czy Linux, pracuję lokalnie lub zdalnie przez SSH. (Nie chcę próbować pamiętać, które z nich są przydatne i warto reset && command-that-outputs-a-bunch
mieć dostęp do pracy.) Terminal.app i iTerm rzucają klucz w tym planie, nie wdrażając reset
poprawnie.
Oznacza to, że zwykłe zastąpienie reset
to nie wszystko: jeśli korzystam z komputera z systemem Linux, musi wiedzieć, czy używam, gnome-terminal
czy iTerm, aby wysłać prawidłową sekwencję zmiany znaczenia.
Czy jest jakiś sposób (nawet jeśli potrzebuję ioctl
), aby zapytać terminal, co to naprawdę jest?
¹ Dla celów tego pytania resetowanie powinno wyczyścić ekran, zresetować kursor i wyczyścić bufor przewijania.
źródło
Terminal.app
ustawienia, zakładkę terminala i ustawisz linie przewijania na 0? Czy to wyłącza cały tekst powyżej bieżącego wiersza, czy tylko cokolwiek powyżej górnej części ekranu? Wiem, że nie jest to dokładnie to, o co prosiłeś, warte strzału.reset
, ponieważ tak wiedzą moje palce.reset
polecenie wyczyści zawartość przewijania wstecz emulatora terminala, ale nie jest to gwarantowane, ponieważ przewijanie wstecz jest funkcją specyficzną dla emulatora terminala, a nie część terminala. Jednak Terminal obsługuje rozszerzenie sekwencji ucieczki ED (Erase in Display), aby usunąć przewijanie do tyłuESC [ 3 J
. Możesz wyczyścić ekran, a następnie użyć go np.reset && printf '\e[3J’
xterm
(przezTERM=xterm
), spodziewam się, że emulujesz nadzbiór XTerm , który usuwa resetowanie po zresetowaniu. (Tak jakbyś wysłał sekwencję ucieczki dla „niebieskiego”, spodziewałbyś się niebieskiego.) To prawda, mój xterm mówi mi toErase is backspace.
, czego jestem wdzięczny, nic więcej; to po prostu denerwujące.Odpowiedzi:
Zastosowanie
$TERM_PROGRAM
.iTerm ustawia to na
iTerm.app
, a Terminal.app naApple_Terminal
.źródło
sshd_config
„sAcceptEnv
prawdopodobnie. Ponieważ to (twoja powłoka działa na innym hoście niż ten, na którym działa terminal) jest bardzo ważną informacją, naprawdę powinna być częścią pytania.$TERM
nie ma nic wspólnego z obecnie działającym emulatorem terminali, jest to tylko domyślny terminal i można go ustawić na cokolwiek. Aby uzyskać nazwę uruchomionego emulatora terminala, możesz użyćps
PID procesu nadrzędnego bieżącej powłoki.UWAGA: Poniższe nie powiedzie się w OSX, ale powinno działać OK w systemie Linux
PID bieżącego procesu powłoki to
$$
. Stamtąd można użyćps
do wyświetlenia drzewa procesów i wydrukowania PID rodzica bieżącej sesji powłoki:Następnie możesz przekazać ten identyfikator PID
ps
i nakazać mu wydrukowanie nazwy polecenia:To obetnie nazwę, powinno wystarczyć, abyś ją rozgryzł, ale może nie być dobre dla skryptów. Aby uzyskać pełną nazwę, możesz spróbować
Oto, co otrzymuję w moim systemie, używając kilku różnych terminali:
terminator
gnome-terminal
xterm
źródło
ps: illegal option -- f
-
przed opcjami powinno działać zgodnie z OSXman ps
.$2
, PPID jest$3
), a proces nadrzędny powłoki może byćlogin
(w zależności od konfiguracji terminala), z różnymi parametrami. Jednak jego proces nadrzędny jestTerminal
.--no-headers
nie istnieje, potrzebujesz czegoś takiegotail -n1
. A ponieważ wszystkie procesy z interfejsem użytkownika mają argument-psn_0_...
,awk '{print $NF}'
też nie działa.Oto przenośny sposób na uzyskanie nazwy lub ścieżki procesu nadrzędnego:
iTerm 2:
gnome-terminal w Ubuntu:
Terminal.app:
Zauważ, że jeśli Terminal.app jest ustawiony na otwieranie nowych powłok z domyślną powłoką logowania, nadrzędnym procesem powłoki jest
login
terminal, a nie terminal.comm
Kolumna jest pełna ścieżka polecenia w OS X i nazwy polecenia skrócona do 15 znaków w realizacji Procps w Linuksie.źródło
login
- czy dostosowałem kiedyś swój profil, aby uruchomić polecenielogin -fp danielbeck
?