Und sag nicht " $TERM
" - es ist immer xterm
.
Wie kann ein bash
Skript feststellen, in welchem Terminal es ausgeführt wird, insbesondere ob es sich um iTerm, Terminal.app oder tatsächlich um ein xterm handelt?
Ich frage, weil reset
es auf Terminal.app und iTerm2 nicht sofort funktioniert¹. iTerm2 erkennt jedoch eine Escape-Sequenz für einen Terminal-Reset ( \x1b]50;ClearScrollback\x07
), und wenn ich sie erkennen könnte, könnte ich sie reset
mit einem Alias überschreiben , der das Richtige tut. AFAICT, Terminal.app fehlt eine Reset-Sequenz, und die Leute greifen auf lächerliche Tom-Hackery zurück, um das zu umgehen .
Mein Endziel hier ist es, dass reset
ich genauso arbeite, egal ob ich unter OS X oder Linux arbeite, lokal oder remote über SSH. (Ich möchte nicht versuchen müssen, mich an welche zu erinnern, und es ist nützlich, reset && command-that-outputs-a-bunch
Up-Enter-Arbeiten auszuführen.) Terminal.app und iTerm werfen einen Schraubenschlüssel in diesen Plan, indem sie nicht reset
korrekt implementiert werden.
Das bedeutet, dass das einfache Überschreiben reset
nicht ganz gnome-terminal
das Richtige ist: Wenn ich auf einem Linux-Computer bin, muss es wissen, ob ich oder iTerm verwende, um die richtige Escape-Sequenz zu senden.
Gibt es eine Möglichkeit (auch wenn ich eine brauche ioctl
), das Terminal zu fragen, was es wirklich ist?
¹Für die Zwecke dieser Frage sollte durch Zurücksetzen der Bildschirm gelöscht, der Cursor zurückgesetzt und der Bildlaufpuffer gelöscht werden.
quelle
Terminal.app
die Einstellungen und die Registerkarte "Terminal" öffnen und die Bildlaufzeilen auf 0 setzen? Deaktiviert das jeglichen Text über der aktuellen Zeile oder nur irgendetwas über dem oberen Bildschirmrand? Ich weiß, es ist nicht genau das, wonach Sie gefragt haben, einen Versuch wert.reset
, da meine Finger das wissen.reset
Befehl den Scrollback-Inhalt des Terminalemulators löscht. Dies ist jedoch nicht garantiert, da das Scrollback eine Terminalemulator-spezifische Funktion ist, nicht wirklich eine Teil eines Terminals. Terminal unterstützt jedoch eine Erweiterung der ED-Escape-Sequenz (Erase in Display), um das Zurückblättern zu löschenESC [ 3 J
. Sie können den Bildschirm löschen und dann verwenden, z. B.reset && printf '\e[3J’
xterm
(durchTERM=xterm
) deklarieren, würde ich erwarten, dass Sie eine Obermenge des XTerm emulieren, die beim Zurücksetzen den Scrollback löscht. (Als ob Sie die Escape-Sequenz für "blau" gesendet hätten, würden Sie blau erwarten.) Zugegeben, mein xterm sagt mir dasErase is backspace.
, was ich dankbar bin, dass nichts anderes tut; das ist nur nervigAntworten:
Verwenden Sie
$TERM_PROGRAM
.iTerm setzt es auf
iTerm.app
und Terminal.app aufApple_Terminal
.quelle
sshd_config
‚sAcceptEnv
wahrscheinlich. Da dies (Ihre Shell läuft auf einem anderen Host als dem, auf dem Ihr Terminal ausgeführt wird) sehr wichtige Informationen sind, sollte es wirklich Teil der Frage sein.$TERM
hat überhaupt nichts mit dem aktuell laufenden Terminalemulator zu tun, es ist nur Ihr Standardterminal und kann auf alles eingestellt werden. Um den Namen des Terminalemulators abzurufen, den Sie ausführen, können Sieps
die PID des übergeordneten Prozesses Ihrer aktuellen Shell abrufen.HINWEIS: Folgendes schlägt unter OSX fehl, sollte jedoch unter Linux einwandfrei funktionieren
Die PID Ihres aktuellen Shell-Prozesses ist
$$
. Von dort aus können Sieps
einen Prozessbaum anzeigen und die PID des übergeordneten Elements Ihrer aktuellen Shell-Sitzung drucken:Sie können diese PID dann an übergeben
ps
und anweisen, den Befehlsnamen auszudrucken:Dadurch wird der Name abgeschnitten. Es sollte ausreichen, um ihn herauszufinden, ist jedoch möglicherweise nicht für die Skripterstellung geeignet. Um den vollständigen Namen zu erhalten, können Sie versuchen
Dies ist, was ich auf meinem System mit ein paar verschiedenen Terminals bekomme:
terminator
gnome-terminal
xterm
quelle
ps: illegal option -- f
-
vor den Optionen sollte gemäß OSX funktionierenman ps
.$2
, PPID ist$3
) und der übergeordnete Prozess der Shell kannlogin
(abhängig von der Terminalkonfiguration) mit unterschiedlichen Parametern sein. Doch sein ist geordneten ProzessTerminal
.--no-headers
existiert nicht, du brauchst so etwastail -n1
. Und da alle Prozesse mit UI ein Argument haben-psn_0_...
,awk '{print $NF}'
funktioniert es auch nicht.Hier ist eine tragbare Methode, um den Namen oder Pfad des übergeordneten Prozesses abzurufen:
iTerm 2:
Gnom-Terminal in Ubuntu:
Terminal.app:
Beachten Sie, dass, wenn Terminal.app so eingestellt ist, dass neue Shells mit der Standard-Login-Shell geöffnet werden, der übergeordnete Prozess der Shell
login
und nicht das Terminal ist.Die
comm
Spalte ist der vollständige Pfad des Befehls in OS X und der Befehlsname, der in der procps-Implementierung unter Linux auf 15 Zeichen gekürzt wurde.quelle
login
- Habe ich mein Profil vor einiger Zeit angepasst, um den Befehl auszuführenlogin -fp danielbeck
?