Et ne dites pas " $TERM
" - c'est toujours xterm
.
Comment un bash
script peut-il dire dans quel terminal il s'exécute, en particulier s'il s'agit d'iTerm, Terminal.app ou en fait d'un xterm?
Je demande parce reset
que ne fonctionne pas¹ sur la base de Terminal.app et iTerm2. iTerm2, cependant, reconnaît une séquence d'échappement pour effectuer une réinitialisation du terminal ( \x1b]50;ClearScrollback\x07
), et si je pouvais la détecter, je pourrais remplacer reset
avec un alias qui fait la bonne chose. AFAICT, Terminal.app n'a pas de séquence de réinitialisation, et les gens ont recours à un piratage ridicule pour pirater cela .
Mon objectif final ici est d'avoir reset
le même travail que je travaille sur OS X ou Linux, en travaillant localement ou à distance via SSH. (Je ne veux pas avoir à essayer de me rappeler lequel, et il est utile de le faire reset && command-that-outputs-a-bunch
et d'avoir un travail de mise à jour.) Terminal.app et iTerm jettent une clé dans ce plan en ne l'implémentant pas reset
correctement.
Cela signifie que simplement remplacer reset
n'est pas tout à fait ça: si je suis sur une machine Linux, il doit savoir si j'utilise gnome-terminal
ou iTerm afin d'envoyer la bonne séquence d'échappement.
Existe-t-il un moyen (même si j'en ai besoin ioctl
) de demander au terminal ce que c'est vraiment ?
¹Pour les besoins de cette question, la réinitialisation doit effacer l'écran, réinitialiser le curseur et effacer le tampon de défilement.
la source
Terminal.app
les paramètres, l'onglet du terminal et définissez les lignes de défilement sur 0? Est-ce que cela désactive tout ou partie du texte au-dessus de la ligne actuelle, ou tout simplement au-dessus du haut de l'écran? Je sais, ce n'est pas exactement ce que tu as demandé, ça vaut le coup.reset
, car c'est ce que mes doigts savent.reset
commande efface le contenu de défilement arrière de l'émulateur de terminal, mais ce n'est pas garanti, car le défilement arrière est une fonctionnalité spécifique à l'émulateur de terminal, pas vraiment une partie d'un terminal. Cependant, Terminal prend en charge une extension de la séquence d'échappement ED (Erase in Display) pour effacer le défilement arrièreESC [ 3 J
. Vous pouvez effacer l'écran, puis l'utiliser, par exemple,reset && printf '\e[3J’
xterm
(à traversTERM=xterm
), je m'attends à ce que vous émuliez un surensemble de l'XTerm, qui efface son défilement lors de la réinitialisation. (Tout comme si vous aviez envoyé la séquence d'échappement pour "bleu", vous vous attendriez à bleu.) Certes, mon xterm me le ditErase is backspace.
, ce que je ne suis reconnaissant de rien d'autre; c'est juste ennuyeux.Réponses:
Utilisez
$TERM_PROGRAM
.iTerm le définit sur
iTerm.app
, et Terminal.app surApple_Terminal
.la source
sshd_config
estAcceptEnv
probablement. Comme cela (votre shell fonctionne sur un hôte différent de celui sur lequel votre terminal fonctionne) est une information très importante, cela devrait vraiment faire partie de la question.$TERM
n'a rien à voir avec l'émulateur de terminal en cours d'exécution, c'est juste votre terminal par défaut et peut être réglé sur n'importe quoi. Pour obtenir le nom de l'émulateur de terminal que vous exécutez, vous pouvez utiliserps
pour obtenir le PID du processus parent de votre shell actuel.REMARQUE: ce qui suit échouera sous OSX mais devrait fonctionner correctement sous Linux
Le PID de votre processus shell actuel est
$$
. À partir de là, vous pouvez utiliserps
pour afficher un arbre de processus et imprimer le PID du parent de votre session shell actuelle:Vous pouvez ensuite transmettre ce PID à
ps
et lui dire d'imprimer le nom de la commande:Cela tronquera le nom, il devrait vous suffire de le comprendre, mais pourrait ne pas être bon pour les scripts. Pour obtenir le nom complet, vous pouvez essayer
Voici ce que j'obtiens sur mon système en utilisant plusieurs terminaux différents:
terminator
gnome-terminal
xterm
la source
ps: illegal option -- f
-
avant les options devrait fonctionner selon OSXman ps
.$2
, PPID est$3
), et le processus parent du shell peut êtrelogin
(selon la configuration du terminal), avec différents paramètres. Cependant, son processus parent l'estTerminal
.--no-headers
n'existe pas, vous auriez besoin de quelque chose commetail -n1
. Et puisque tous les processus avec UI ont un argument-psn_0_...
,awk '{print $NF}'
cela ne fonctionne pas non plus.Voici un moyen portable d'obtenir le nom ou le chemin du processus parent:
iTerm 2:
gnome-terminal dans Ubuntu:
Terminal.app:
Notez que si Terminal.app est défini pour ouvrir de nouveaux shells avec le shell de connexion par défaut, le processus parent du shell est
login
et non le terminal.La
comm
colonne est le chemin complet de la commande sous OS X et le nom de la commande tronqué à 15 caractères dans l'implémentation procps sous Linux.la source
login
- Ai-je personnalisé mon profil quelque temps en arrière pour exécuter la commandelogin -fp danielbeck
?