In Terminale, come puoi determinare quale shell è effettivamente in esecuzione?

2

Usando Terminale su OS X 10.11.4, inizializzando Terminale si apre una nuova finestra in esecuzione bash (di default). A quanto ho capito, l'immissione di echo $SHELL dovrebbe generare la shell a cui è stato inviato il comando. Quindi, perché ottengo questo risultato dopo il passaggio da bash a tcsh ?

[<dir>] <username>$ tsch
[<dir>] <username>% echo $SHELL
/bin/bash
    
posta JDQ 28.04.2016 - 00:49
fonte

4 risposte

4

Sotto% family shell di% co_de, avrai la tua shell funzionante con questo comando:

% echo $shell

Se csh è stato eseguito, direttamente o indirettamente, da una shell della famiglia Bourne che ha esportato la sua variabile SHELL, quest'ultimo essendo il caso comune, la variabile SHELL rimarrebbe invariata, quindi csh mostrerà ancora il suo valore precedente che sarebbe fonte di confusione.

Questo è quello che ti sta succedendo, uno dei processi parent della tua sessione echo $SHELL era tcsh . Se bash viene avviato con la variabile bash unset, imposta il percorso su SHELL , nonostante ciò che afferma la documentazione. Si noti che l'avvio di una nuova famiglia di shell Bourne non avrebbe cambiato la variabile SHELL se impostata. SHELL non è sicuramente il modo per identificare quale shell stai usando, solo per sapere quale shell è la tua shell predefinita quando si trova in un ambiente POSIX.

Un modo portatile per sapere quale shell è attualmente in esecuzione sarebbe:

ps -o comm= -p $$

Tuttavia, quest'ultimo comando presuppone che bash sia impostato sul PID di processo corrente, che sfortunatamente alcune shell esotiche come $$ break. Un modo ancora più portabile per risolvere questo problema è:

env sh -c 'basename $(ps -o comm= -p $(ps -o ppid= -p $$))'
    
risposta data 28.04.2016 - 01:20
fonte
4

Dipende dalla shell in esecuzione.

Se è un POSIX che conferma shell, ad es. bash, cenere, cenere, sh e alcuni altri, ad es. csh, tcsh then echo $0 restituirà il nome della shell

es.

~ $ bash
bash-3.2$ echo $0
bash

o

~ $ ksh
$ echo $0
ksh

Tuttavia non tutte le shell sono POSIX ad es. Ho usato il profilo della shell ipython e ora il pesce

    
risposta data 28.04.2016 - 01:05
fonte
2

Un altro modo sarebbe quello di verificare su quale TTY è collegato il terminale e controllare quale shell è in esecuzione su quel tty. Quindi puoi guardare il PID (Process ID) e il PPID (Parent Process ID) nel caso in cui la tua shell abbia generato un'altra shell come processo figlio:

MacBook:~$ w
15:16  up 8 days, 16:11, 2 users, load averages: 1.26 1.22 1.24
USER     TTY      FROM              LOGIN@  IDLE WHAT
myuser   console  -                19Apr16 8days -
myuser   s000     -                15:15       - w
MacBook:~$ ps -ef | grep s000
UID   PID  PPID   C STIME   TTY           TIME CMD
    0 23865   293   0  3:15PM ttys000    0:00.14 login -pf myuser /bin/bash
  501 23866 23865   0  3:15PM ttys000    0:00.05 -bash
    0 23992 23866   0  3:16PM ttys000    0:00.01 ps -ef
  501 23993 23866   0  3:16PM ttys000    0:00.00 grep s000
MacBook:~$ 

Nell'esempio sopra, usando il comando w , ho scoperto che l'utente myuser è loggato a console (ignora questo) e anche a s000 .

Ho quindi eseguito ps -ef e guardando solo le colonne PID e PPID, posso vedere che login (PID 23865) ha eseguito bash (PID 23866, PPID 23865), che ha quindi eseguito due processi: ps -ef (PID 23992, PPID 23866) e grep s000 (PID 23993 PPID 23866).

Se, per qualche ragione, ho eseguito tcsh da bash , l'esecuzione dei comandi precedenti mi permetterebbe comunque di vedere quale shell è il mio attuale comando eseguito da.

    
risposta data 28.04.2016 - 17:22
fonte
1

Quando avvii una sessione terminale in OS X viene richiamata l'utilità login .

Dalla pagina man:

The login utility enters information into the environment (see environ(7)) specifying the user's home directory (HOME), command inter-
preter (SHELL), search path (PATH), terminal type (TERM) and user name (both LOGNAME and USER).

Some shells may provide a builtin login command which is similar or identical to this utility.  Consult the builtin(1) manual page.

Notare le opzioni utilizzate quando viene chiamata l'utility, quindi leggere la pagina man:

ps -ef | grep -w [l]ogin

Alcune di queste informazioni sono state raccolte dal tuo record in opendirectory.

dscl . -read /Users/your_user_name RecordName UserShell NFSHomeDirectory
    
risposta data 28.04.2016 - 17:01
fonte

Leggi altre domande sui tag