Wie identifiziere ich das Terminal anhand eines Skripts?

Wie identifiziere ich das Terminal anhand eines Skripts?

Und sagen Sie nicht „ $TERM“ – es heißt immer xterm.

Wie kann ein bashSkript feststellen, in welchem ​​Terminal es ausgeführt wird, insbesondere ob es iTerm, Terminal.app oder tatsächlich ein xterm ist?

Ich frage, weil resetes 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 resetmit 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 resetalles 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-bunchArbeit 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 resetrichtig durchführen.

Dies bedeutet, dass einfaches Überschreiben resetnicht ausreicht: Wenn ich auf einem Linux-Rechner bin, muss dieser wissen, ob ich gnome-terminaloder 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.appund Terminal.app auf Apple_Terminal.

Antwort2

$TERMhat ü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 psdie 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 pseinen 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 psund 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:

  1. terminator

    $ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    /usr/bin/x-terminal-emulator
    
  2. gnome-terminal

    $ ps --no-headers $(ps -axjf | awk -v pid=$$ '($2==pid){print $1}') | 
       awk '{print $NF}'
    /usr/lib/gnome-terminal/gnome-terminal-server
    
  3. 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 loginund nicht das Terminal ist.

Die commSpalte 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.

verwandte Informationen