Und sagen Sie nicht „ $TERM
“ – es heißt immer xterm
.
Wie kann ein bash
Skript feststellen, in welchem Terminal es ausgeführt wird, insbesondere ob es iTerm, Terminal.app oder tatsächlich ein xterm ist?
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. Soweit ich weiß, fehlt in Terminal.app eine Reset-Sequenz, unddie Leute greifen auf lächerliche Tom-Hacker zurück, um das zu umgehen.
Mein Endziel ist, dass reset
alles gleich funktioniert, egal ob ich unter OS X oder Linux arbeite, lokal oder remote über SSH. (Ich möchte mir nicht merken müssen, was ich mache, und es ist praktisch, um die reset && command-that-outputs-a-bunch
Arbeit im Voraus erledigen und erledigen zu können.) Terminal.app und iTerm machen diesem Plan einen Strich durch die Rechnung, da sie die Implementierung nicht reset
richtig durchführen.
Dies bedeutet, dass einfaches Überschreiben reset
nicht ausreicht: Wenn ich auf einem Linux-Rechner bin, muss dieser wissen, ob ich gnome-terminal
oder iTerm verwende, um die richtige Escape-Sequenz zu senden.
Gibt es eine Möglichkeit (selbst wenn ich ein brauche ioctl
), das Terminal zu fragen, was esWirklichIst?
¹Für die Zwecke dieser Frage sollte „Reset“ den Bildschirm löschen, den Cursor zurücksetzen und den Scrollback-Puffer löschen.
Antwort1
Verwenden $TERM_PROGRAM
.
iTerm setzt es auf iTerm.app
und Terminal.app auf Apple_Terminal
.
Antwort2
$TERM
hat überhaupt nichts mit dem aktuell laufenden Terminalemulator zu tun, es ist einfach Ihr Standardterminal und kann beliebig eingestellt werden. Um den Namen des von Ihnen ausgeführten Terminalemulators zu erhalten, können Sie ps
die PID des übergeordneten Prozesses Ihrer aktuellen Shell abrufen.
HINWEIS: Folgendes schlägt unter OSX fehl, sollte unter Linux jedoch einwandfrei funktionieren.
Die PID Ihres aktuellen Shell-Prozesses ist $$
. Von dort aus können Sie ps
einen Prozessbaum anzeigen und die PID des übergeordneten Prozesses Ihrer aktuellen Shell-Sitzung ausdrucken:
ps -axjf | awk -v pid=$$ '($2==pid){print $1}'
Sie können diese PID dann übergeben ps
und ihr sagen, dass sie den Befehlsnamen drucken soll:
ps -o comm= $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}')
Dadurch wird der Name gekürzt. Das sollte ausreichen, um den Namen herauszufinden, ist aber möglicherweise nicht gut für Skripte. Um den vollständigen Namen zu erhalten, können Sie Folgendes versuchen:
ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}'
Dies ist, was ich auf meinem System über einige verschiedene Terminals erhalte:
terminator
$ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}' /usr/bin/x-terminal-emulator
gnome-terminal
$ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}' /usr/lib/gnome-terminal/gnome-terminal-server
xterm
$ ps --no-headers $(ps axjf | awk -v pid=$$ '($2==pid){print $1}') | awk '{print $NF}' xterm
Antwort3
So können Sie den Namen oder Pfad des übergeordneten Prozesses portabler Art ermitteln:
iTerm 2:
$ ps -p $(ps -p $$ -o ppid=) -o comm=
/Applications/iTerm.app/Contents/MacOS/iTerm
Gnome-Terminal in Ubuntu:
$ ps -p $(ps -p $$ -o ppid=) -o comm=
gnome-terminal
Terminal.app:
$ ps -p $(ps -p $$ -o ppid=) -o comm=
login
Beachten Sie, dass, wenn Terminal.app so eingestellt ist, dass neue Shells mit der Standard-Anmelde-Shell geöffnet werden, dies der übergeordnete Prozess der Shell login
und nicht das Terminal ist.
Die comm
Spalte enthält den vollständigen Pfad des Befehls in OS X und den auf 15 Zeichen gekürzten Befehlsnamen in der Procps-Implementierung in Linux.