Si j'ouvre un terminal comme si xterm
j'avais un shell. Ensuite, si j'utilise ssh
ou zsh
j'aurai un autre "niveau" de shell. Existe-t-il un moyen de savoir combien de fois je dois Ctrl+D
ou taper exit
pour 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.
ps: illegal option -- -
une idée pourquoi? Je le--option-name
est 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 deps --no-headers
portable en ajoutant=
après le nom de la colonne. De plus, lacomm
colonne n'est pas POSIX, mais lacmd
colonne (qui comprend les arguments de la commande) l'est également. Est également-p
nécessaire avant le PID dans la syntaxe POSIX. Par conséquent,ps -o cmd= -p $PPID
est portable et donne des informations similaires.comm
colonne est spécifiée par POSIX et documentée sur Mac OS X, alors qu'ellecmd
existe sous Linux mais qu’elle n’est pas standard.Vous avez en fait trouvé le terme correct¹. Il existe une variable d'environnement dans
SHLVL
laquelle 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, ilSHLVL
augmente de 1.Toutefois, cela ne répond pas directement à vos préoccupations, car
SHLVL
il en va de même pour les émulateurs de terminaux. Par exemple, dans ma configuration typique,$SHLVL
correspond à 2 dans un xterm, car le niveau 1 correspond au shell qui exécute ma session X (~/.xinitrc
ou~/.xsession
).Ce que je fais est d'afficher
$SHLVL
dans 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 unesh
ponctuation 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$$
etps -o tty= -p$PPID
produire des résultats différents. Vous pouvez réinitialiser manuellement la valeurSHLVL
1 dans ces coquilles ou définir la vôtreTERMSHLVL
sur 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
.la source
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.ps -o tty= -p$$
etps -o tty= -p$PPID
, parce que vous avez dit qu'ils devraient produire une sortie différente. Ou ai-je mal compris quelque chose?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).ps -p $$ -p $PPID
donne (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 -bashPas 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.
Et utilisez-le pour déduire le nombre de coques que vous aurez besoin de quitter, avant d'arriver à la "racine" shell
la source
Vous pouvez utiliser la variable d'environnement SHLVL :
la source
ssh
par exemple, le même compte, ce sera toujours1
Je trouve que
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
nohup
emploi en cours ou similaire.(En outre, j'utilise
alias grep='grep --color=auto'
.)la source