Come conoscere il "livello" di shell in cui mi trovo?


32

Se apro un terminale come xtermse avessi una shell. Quindi se uso ssho zshavrò un altro "livello" di shell. C'è un modo per sapere quante volte devo Ctrl+Do digitare exitper uscire da tutte? La mia vera intenzione è quella di uscire da tutto tranne che dalla shell "root".

Sarà anche bello sapere quale effetto (i) multiplexer terminali (come screen) hanno sulla soluzione.

PS: Sentiti libero di cambiare il titolo, non so se questi sono i termini corretti.

Risposte:


6

Un modo (certamente non perfetto) è quello di aggiungere il risultato ps --no-headers -o comm $PPIDal prompt della shell. Questo ti dirà il nome del processo che ha generato la tua shell. Se ti trovi in ​​uno zsh nidificato, verrà indicato "zsh". Se ti trovi in ​​uno zsh di livello superiore, leggerà "xterm" o "screen" o qualunque cosa stia eseguendo la tua shell.

Per sapere se sei all'interno di una sessione ssh o su, puoi semplicemente guardare il nome host e il nome utente parte del tuo prompt.

Quando esegui schermate nidificate (cosa che non immagino sia una situazione comune), non riesco a pensare a se sei nella shell di livello superiore di una schermata nidificata o nella shell di livello superiore della schermata di livello superiore. È possibile configurare lo schermo in modo da visualizzare sempre una linea di stato, che comporterebbe la visualizzazione di più linee di stato, se ci si trova nelle schermate nidificate.


Aaah ... schiocco ... battimi. :) +1
Stefan,

Attualmente sono su un mac e il comando mi ha dato ps: illegal option -- -, qualche idea sul perché? Lo
proverò di

3
@phunehehe: --option-nameè principalmente una funzionalità specifica per GNU, quindi non è per lo più disponibile nelle utility di sistema standard esterne a Linux. Ma puoi ottenere l'effetto di ps --no-headersportabilmente aggiungendo =dopo il nome della colonna. Inoltre la commcolonna non è POSIX, ma la cmdcolonna (che include gli argomenti del comando) lo è. Inoltre -pè necessario prima del PID nella sintassi POSIX. Quindi ps -o cmd= -p $PPIDè portatile e fornisce informazioni simili.
Gilles 'SO- smetti di essere malvagio' il

confermato, lavora su Gentoo
phunehehe il

2
@phunehehe: scusa, ho fatto un errore nel commento sopra. In effetti la commcolonna è specificata da POSIX e documentata su Mac OS X, mentre la cmdcolonna esiste su Linux ma non è standard.
Gilles 'SO- smetti di essere malvagio' il

37

In effetti hai colpito il termine corretto¹. Esiste una variabile d'ambiente SHLVLche tutte le principali shell interattive (bash, tcsh, zsh) incrementano di 1 all'avvio. Quindi, se si avvia una shell all'interno di una shell, SHLVLaumenta di 1.

Questo non risponde direttamente alla tua preoccupazione, tuttavia, perché SHLVLtrasporta cose come gli emulatori terminali. Ad esempio, nella mia configurazione tipica, $SHLVLè 2 in un xterm, perché il livello 1 corrisponde alla shell che esegue la mia sessione X ( ~/.xinitrco ~/.xsession).

Quello che faccio è visualizzare $SHLVLnel mio prompt, ma solo se il processo genitore della shell è un'altra shell (con euristiche come "se il suo nome termina shcon punteggiatura e cifre opzionali, è una shell"). In questo modo, ho un'ovvia indicazione visiva nel caso insolito di una shell che gira sotto un'altra shell.

Forse preferiresti rilevare shell che sono in esecuzione direttamente sotto un emulatore di terminale. È possibile farlo in modo abbastanza preciso: questi sono i gusci cui processo genitore ha un diverso terminale di controllo, in modo che ps -o tty= -p$$e ps -o tty= -p$PPIDprodurre output diverso. È possibile reimpostare manualmente SHLVLsu 1 in queste shell o impostarne il proprio TERMSHLVLsu 1 in queste shell (e incrementare altrimenti).

¹ Sebbene non lo si pensi guardando le pagine del manuale: nessuna delle tre shell che lo supportano include la parola "livello" nella loro documentazione di SHLVL.


Grazie per aver confermato il termine. Sono ancora su un mac e sono sorpreso di trovare quei 2 comandi che danno lo stesso risultato, indipendentemente dal mio livello di shell.
phunehehe,

@phunehehe: quali 2 comandi? Se vuoi dire ps -o tty= -p$pid, questo mostra il terminale di controllo del processo, che identifica l'emulatore di terminale (xterm, screen, sshd, ...) in cui è in esecuzione il processo. Non cambierà se avvii una shell da un'altra shell, ma cambierà se avviare un nuovo emulatore di terminale. Se l'emulatore di terminale è un'applicazione Mac nativa, potrebbe esserci una sottigliezza specifica per Mac di cui non sono a conoscenza.
Gilles 'SO- smetti di essere malvagio' il

ps -o tty= -p$$ e ps -o tty= -p$PPID , poiché hai detto che dovrebbero produrre output diversi. O ho frainteso qualcosa?
phunehehe,

@phunehehe: forniscono un output diverso quando il processo genitore della shell è un emulatore di terminale, poiché l'emulatore di terminale non ha il suo terminale emulato come terminale di controllo. Se trovi diversamente, pubblica l'output di ps -p $$ -p $PPID(di nuovo, non ho esperienza OSX, quindi forse c'è qualcosa di insolito in corso su OSX).
Gilles 'SO- smetti di essere malvagio' il

@Gilles: era davvero qualcosa di insolito con OSX. Ho provato su Gentoo e tutto era corretto come hai detto. Su OSX, ps -p $$ -p $PPIDdà (mi dispiace non so come formattare i commenti) PID TTY TIME CMD 209 ttys000 0: 00.01 login -pf phunehehe 210 ttys000 0: 00.12 -bash
phunehehe

1

Non molto elegante, ma puoi usare la visualizzazione ad albero in htop per vedere la relazione genitore-figlio della tua shell con altri processi in esecuzione.

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

E usalo per dedurre la quantità di shell che dovrai uscire prima di arrivare alla shell "root"


1

È possibile utilizzare la variabile di ambiente SHLVL :

echo "$SHLVL"

1
Se usi, sshad esempio, lo stesso account, sarà ancora1
Anthon,

0

trovo che

$ pstree -u | grep ${USER}

può essere molto utile per vedere dove mi "inserisco" in un sistema. Lo preferisco finita pstree -u ${USER}.

Occasionalmente mi ricorderà che ho lasciato un nohuplavoro in esecuzione o simile.

(Inoltre, io uso alias grep='grep --color=auto'.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.