Comment connaître le «niveau» d'obus dans lequel je suis?

32

Si j'ouvre un terminal comme si xtermj'avais un shell. Ensuite, si j'utilise sshou zshj'aurai un autre "niveau" de shell. Existe-t-il un moyen de savoir combien de fois je dois Ctrl+Dou taper exitpour les sortir tous? Mon intention réelle est de tout quitter sauf le shell "root".

Il sera également utile de savoir quel effet ont les multiplexeurs de terminaux (du type screen) sur la solution.

PS: S'il vous plaît, n'hésitez pas à changer le titre, je ne sais pas si ce sont les termes corrects.

phunehehe
la source

Réponses:

6

Une façon (certes pas parfaite) est d’ajouter le résultat de ps --no-headers -o comm $PPIDvotre invite de commande. Cela vous indiquera le nom du processus qui a engendré votre shell. Si vous êtes dans un zsh imbriqué, il va dire "zsh". Si vous êtes à l'intérieur d'un zsh de niveau supérieur, il affichera "xterm" ou "screen" ou ce que votre shell exécute.

Pour savoir si vous êtes dans une session ssh ou su, vous pouvez simplement regarder la partie nom d'hôte et nom d'utilisateur de votre invite.

Lorsque vous exécutez des écrans imbriqués (ce que je n'imagine pas comme une situation courante), il est impossible de savoir si vous êtes dans le shell de niveau supérieur d'un écran imbriqué ou dans le shell de niveau supérieur. de l'écran de niveau supérieur. Vous pouvez configurer l'écran pour toujours afficher une ligne d'état, ce qui entraînerait l'affichage de plusieurs lignes d'état, si vous êtes dans des écrans imbriqués.

sepp2k
la source
Aaah ... Snap ... me battre. :) +1
Stefan
Actuellement, je suis sur un mac et la commande m'a donné ps: illegal option -- -une idée pourquoi? Je le
testerai
3
@phunehehe: --option-nameest principalement une fonctionnalité spécifique à GNU, elle n'est donc généralement pas disponible dans les utilitaires système standard en dehors de Linux. Mais vous pouvez obtenir l'effet de ps --no-headersportable en ajoutant =après le nom de la colonne. De plus, la commcolonne n'est pas POSIX, mais la cmdcolonne (qui comprend les arguments de la commande) l'est également. Est également -pnécessaire avant le PID dans la syntaxe POSIX. Par conséquent, ps -o cmd= -p $PPIDest portable et donne des informations similaires.
Gilles 'SO- arrête d'être méchant'
confirmé, travaille sur Gentoo
phunehehe
2
@phunehehe: désolé, j'ai commis une erreur dans le commentaire ci-dessus. En fait, la commcolonne est spécifiée par POSIX et documentée sur Mac OS X, alors qu'elle cmdexiste sous Linux mais qu’elle n’est pas standard.
Gilles 'SO- arrête d'être méchant'
37

Vous avez en fait trouvé le terme correct¹. Il existe une variable d'environnement dans SHLVLlaquelle tous les principaux shells interactifs (bash, tcsh, zsh) sont incrémentés de 1 au démarrage. Donc, si vous démarrez un shell à l'intérieur d'un shell, il SHLVLaugmente de 1.

Toutefois, cela ne répond pas directement à vos préoccupations, car SHLVLil en va de même pour les émulateurs de terminaux. Par exemple, dans ma configuration typique, $SHLVLcorrespond à 2 dans un xterm, car le niveau 1 correspond au shell qui exécute ma session X ( ~/.xinitrcou ~/.xsession).

Ce que je fais est d'afficher $SHLVLdans mon invite, mais uniquement si le processus parent du shell est un autre shell (avec une heuristique du type «si son nom se termine par une shponctuation facultative et des chiffres, c'est un shell»). De cette façon, j'ai une indication visuelle évidente dans le cas peu commun d'un shell fonctionnant sous un autre shell.

Peut-être préférez-vous détecter les shells qui s'exécutent directement sous un émulateur de terminal. Vous pouvez le faire de façon assez précise: ce sont les coquilles dont le processus parent a un terminal de contrôle différent, de sorte que ps -o tty= -p$$et ps -o tty= -p$PPIDproduire des résultats différents. Vous pouvez réinitialiser manuellement la valeur SHLVL1 dans ces coquilles ou définir la vôtre TERMSHLVLsur 1 dans ces coquilles (et l'incrémenter autrement).

¹ Bien que l’on ne le croirait pas en regardant les pages du manuel: aucun des trois réservoirs qui le supportent n’incluent le mot «niveau» dans leur documentation de SHLVL.

Gilles, arrête de faire le mal
la source
Merci d'avoir confirmé le terme. Je suis toujours sur mac et surpris de constater que ces 2 commandes donnent le même résultat, quel que soit mon niveau de shell.
Phunehehe
@phunehehe: quelles sont les 2 commandes? Si vous voulez dire ps -o tty= -p$pid, cela montre le terminal de contrôle du processus, qui identifie l'émulateur de terminal (xterm, screen, sshd,…) dans lequel le processus s'exécute. Cela ne changera pas si vous démarrez un shell à partir d'un autre, mais changera si vous démarrer un nouvel émulateur de terminal. Si l'émulateur de terminal est une application Mac native, il se peut que je ne connaisse pas une subtilité spécifique à Mac.
Gilles 'SO- arrête d'être méchant'
ps -o tty= -p$$ et ps -o tty= -p$PPID , parce que vous avez dit qu'ils devraient produire une sortie différente. Ou ai-je mal compris quelque chose?
Phunehehe
@phunehehe: Ils donnent une sortie différente lorsque le processus parent du shell est un émulateur de terminal, car l'émulateur de terminal n'a pas son terminal émulé en tant que terminal de contrôle. Si vous trouvez le contraire, publiez le résultat de ps -p $$ -p $PPID(encore une fois, je n'ai aucune expérience OSX, alors peut-être qu'il se passe quelque chose d'inhabituel sous OSX).
Gilles 'SO- arrête d'être méchant'
@ Gilles: c'était en effet quelque chose d'inhabituel avec OSX. J'ai testé sur Gentoo et tout était correct comme vous l'avez dit. Sous OSX, ps -p $$ -p $PPIDdonne (désolé, je ne sais pas comment formater les commentaires) PID TTY TIME CMD 209 ttys000 0: 00.01 connexion -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe
1

Pas très élégant, mais vous pouvez utiliser l’ arborescence dans htop pour voir la relation parent-enfant de votre shell avec d’autres processus en cours d’exécution.

$ htop # then press 't' and scroll around or 'Ctrl-W' to find your shell proccess

Et utilisez-le pour déduire le nombre de coques que vous aurez besoin de quitter, avant d'arriver à la "racine" shell

Stefan
la source
1

Vous pouvez utiliser la variable d'environnement SHLVL :

echo "$SHLVL"
Alex
la source
1
Si vous utilisez, sshpar exemple, le même compte, ce sera toujours1
Anthon
0

Je trouve que

$ pstree -u | grep ${USER}

peut être très utile pour voir où je "s'intègre" sur un système. Je préfère ça pstree -u ${USER}.

Parfois, cela me rappellera que j'ai quitté un nohupemploi en cours ou similaire.

(En outre, j'utilise alias grep='grep --color=auto'.)

J_H
la source