Ho Ubuntu sulla mia macchina e sto eseguendo un fantastico gestore di finestre. Come posso verificare quale terminale sto utilizzando? C'è un comando per questo?
Ho Ubuntu sulla mia macchina e sto eseguendo un fantastico gestore di finestre. Come posso verificare quale terminale sto utilizzando? C'è un comando per questo?
Risposte:
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. Il valore di pid
later può essere passato al ps -p <pid> -o args
comando.Tecnicamente, per l'emulatore di terminale non hai nemmeno bisogno di un comando, come indicato nei commenti :
cosa intendi con quale? Fai clic su Aiuto -> Informazioni su questo? - JoKeR
La prima cosa che dobbiamo chiarire è esattamente ciò che viene chiesto: scoprire la shell in esecuzione o il terminale in esecuzione. Spesso questi due termini sono usati in modo intercambiabile, ma sono cose completamente diverse. Shell è l'interprete della riga di comando, in particolare la shell interattiva è il prompt più il campo di testo in cui si immettono i comandi. Le shell possono anche essere non interattive, ad esempio uno script avvia una shell non interattiva o bash -c 'echo hello world'
avvia anche una shell non interattiva.
Al contrario, il terminale è l'interfaccia per shell (anche se potrebbe essere anche un'altra applicazione). Originariamente il terminale si riferiva all'hardware reale, ma oggigiorno sono principalmente software. Quello che vedi quando premi Ctrl+ Alt+ to fai clic sull'icona del terminale nella GUI, che avvia un emulatore di terminale, una finestra che imita il comportamento dell'hardware e all'interno di quella finestra puoi vedere la shell in esecuzione. Ctrl+ Alt+ F2(o uno qualsiasi dei 6 tasti funzione) aprirà la console virtuale, ovvero tty
. Consiglio di leggere Perché un terminale virtuale è "virtuale" e cosa / perché / dove si trova il terminale "reale"? per maggiori informazioni sui dettagli.
A ciascun utente è assegnata una shell predefinita /etc/passwd
per il proprio nome utente. Supponendo che tu stia utilizzando la configurazione predefinita e non abbia chiamato esplicitamente un'altra shell come comando, è sufficiente fare:
echo $SHELL
Ma ovviamente questo mostra solo un valore predefinito . Supponiamo di fare quanto segue:
user@ubuntu:~$ dash
$
Eravamo originariamente bash
, ma ha iniziato sessione interattiva di /bin/dash
, POSIX di Ubuntu o shell di sistema . La variabile $SHELL
non cambierà, perché non è questo il suo scopo: mostra il valore predefinito non corrente. Dovremo affrontarlo da un'altra prospettiva: la prospettiva di un processo, che è qualcosa che ho trattato in Sto usando bash o sh?
$ echo $$
4824
$ cat /proc/4824/comm
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash
Qui sfruttiamo il /proc/
filesystem. Il nome del processo e i parametri della riga di comando vengono visualizzati in /proc/<pid>/comm
. Tutto ciò di cui abbiamo bisogno è fornire il PID della shell, che è ciò che $$
fa. Nell'esempio sopra lo sto aggiungendo separatamente, ma non c'è nulla che ci impedisce di fare solo
cat /proc/$$/comm
Potrebbe anche essere una variazione sul tema
ps -p $$ -o args
Un altro modo in cui possiamo affrontare questo è controllando dove /proc/<pid>/exe
. Questo file è un collegamento simbolico che punta al file eseguibile. Così possiamo fare
user@ubuntu:~$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1241/exe -> /bin/bash
user@ubuntu:~$ sh
$ ls -l /proc/$$/exe
lrwxrwxrwx 1 adminx adminx 0 Apr 4 18:20 /proc/1255/exe -> /bin/dash
Entrambi i due approcci funzionano nel 99% dei casi. Certo, ci sono modi in cui possono essere sovvertiti. Per esempio, link simbolico non punterà da nessuna parte se l'eseguibile è stato eliminato poco dopo il guscio ha iniziato (e in quel caso probabilmente si incontrano problemi di sistema, dal momento che la rimozione /bin/sh
, /bin/dash
o addirittura /bin/bash
non è consigliato - dopo tutto un sacco di script affidamento su di loro , in particolare quelli a livello di sistema). Il nome del comando per la shell è di solito impostato come il primo argomento in execve()
syscall. Questo è trattato in Come fa Bash a sapere come viene invocato? , quindi se si dispone di un'applicazione che avvia una shell tramite execve()
, potrebbe dargli qualsiasi nome. Ma queste sono cose non standard e non tipiche, che dovrebbero essere evitate per motivi di coerenza e sicurezza.
Possiamo iniziare con le variabili di ambiente. Molti terminali sembrano mascherarsi come xterm
compatibili, come riportato da echo $TERM
o echo $COLORTERM
. Ma le variabili d'ambiente non sono uno strumento molto affidabile. Possono essere impostati e non impostati. Possiamo fare di nuovo la stessa cosa con i PID, tranne che questa volta esamineremo il PID principale. Come ricorderete, il terminale è l'interfaccia della shell e spesso avvia la shell stessa. Quindi possiamo scoprire quale processo è il processo genitore della nostra shell:
$ ps -p $$ -o args,ppid
COMMAND PPID
bash 1234
$ ps -p 1234 -o args
COMMAND
/usr/lib/gnome-terminal/gnome-terminal-server
Prova di Let con un'altra applicazione terminale, sakura
:
$ ps -p $$ -o args,ppid
COMMAND PPID
/bin/bash 16950
$ ps -p 16950 -o args
COMMAND
sakura
Da lì possiamo già vedere che ciò che ha iniziato questa shell è gnome-terminal
. Questo metodo ovviamente funziona supponendo che tu stia lavorando con la shell interattiva. Se stiamo provando a scoprire il genitore bash -c '...'
o la shell avviata tramite ssh
, ad esempio, il PID potrebbe benissimo provenire da un'applicazione non terminale e forse non dalla GUI.
Quindi, se vogliamo occuparci in modo specifico del terminale della GUI, ciò che possiamo fare è eseguire xprop
, fare clic sulla finestra desiderata, visualizzarne il pid e scoprire qual è il nome di quel processo corrispondente al pid. O in altre parole:
$ ps aux | grep $(xprop | awk -F'=' '/PID/ {print $2}')
xieerqi 2124 0.6 1.7 208068 34604 ? Sl 18:47 1:49 gnome-terminal
Inoltre, secondo le specifiche , i gestori delle finestre dovrebbero impostare la WM_CLASS
proprietà. Quindi, possiamo ottenerlo anche da xprop
:
$ xprop WM_CLASS
WM_CLASS(STRING) = "sakura", "Sakura"
Naturalmente, questo ha anche il suo 1% di svantaggi: l'impostazione delle WM_CLASS
proprietà si basa sul window manager che lo fa e il PID non è garantito per una finestra accurata (vedi Quale processo ha creato questa finestra X11? ), Che può comportare un debug complesso. E questi non sono difetti dei metodi stessi ma del server X11. Tuttavia, i gestori di finestre più stabili e noti (come openbox, Metacity, blackbox) e la maggior parte delle applicazioni sono ben educati, quindi non dovremmo aspettarci problemi con qualcosa come Gnome Terminal o Terminator.
Ma quando si tratta di emulatori di terminali GUI, non abbiamo nemmeno bisogno di trovare un comando. Possiamo semplicemente usare la About
finestra di dialogo della finestra stessa. Eccezione a quella regola è xterm
.
$SHELL
, certo
ps | grep
? ps -p $$
! Oppure, semplicemente per il comando, ps -p $$ -o cmd=
.
ps | grep
è solo una cattiva forma. La maggior parte di ciò che puoi grep, può effettivamente essere ottenuto da ps
solo o da altri strumenti.
La versione breve (thx @Serg )
cat /etc/alternatives/x-terminal-emulator
La versione lunga
sudo update-alternatives --config x-terminal-emulator
e cerca *
l'output
;)
Esempio di output
There are 7 alternatives which provide `x-terminal-emulator’.
Alternativa alla selezione ---------------- 1 / usr / bin / xterm 2 / usr / bin / uxterm 3 / usr / bin / koi8rxterm 4 / usr / bin / lxterm * + 5 /usr/bin/gnome-terminal.wrapper 6 / usr / bin / konsole 7 /usr/bin/xfce4-terminal.wrapper
Press enter to keep the default[*], or type selection number:
Oppure, grazie a @muru , ecco un output più dettagliato
$ update-alternatives --display x-terminal-emulator
x-terminal-emulator - auto mode
link currently points to /usr/bin/gnome-terminal.wrapper
/usr/bin/gnome-terminal.wrapper - priority 40
slave x-terminal-emulator.1.gz: /usr/share/man/man1/gnome-terminal.1.gz
/usr/bin/koi8rxterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/koi8rxterm.1.gz
/usr/bin/lxterm - priority 30
slave x-terminal-emulator.1.gz: /usr/share/man/man1/lxterm.1.gz
/usr/bin/mate-terminal.wrapper - priority 30
slave x-terminal-emulator.1.gz: /usr/share/man/man1/mate-terminal.1.gz
/usr/bin/uxterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/uxterm.1.gz
/usr/bin/xterm - priority 20
slave x-terminal-emulator.1.gz: /usr/share/man/man1/xterm.1.gz
Current 'best' version is '/usr/bin/gnome-terminal.wrapper'.
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
oupdate-alternatives: error: unknown argument
--config
sudo
. Usaupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
per ottenere la destinazione di questo collegamento simbolico invece di utilizzarla cat
. L' file
utilità deve essere installata sulla maggior parte dei sistemi e può essere utilizzata per trovare l'eseguibile di destinazione. cat
sul collegamento simbolico è possibile stampare qualsiasi script di shell o persino file binario a seconda della destinazione di questo collegamento (script di shell per gnome-terminal
, file binario urxvt
, ecc.).
Se vuoi conoscere il programma terminale che stai utilizzando, usa questo:
ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
Eseguilo subito dopo aver aperto il terminale (shell) senza creare ulteriori istanze di shell .
Quando si apre il programma terminale, in pratica genera un programma figlio, una shell. Quindi il genitore della shell generata è il terminale stesso. In altre parole, il PPID della shell è il PID del programma terminale.
Qui stiamo trovando l'ID di processo principale (PPID) della shell ( bash
) ps -o 'ppid=' -p $$
, che sarà l'ID di processo del programma terminale.
Quindi troviamo il nome del processo dal PID:
$ ps -o 'cmd=' -p $(ps -o 'ppid=' -p $$)
gnome-terminal
Fondamentalmente è una fodera di:
$ ps -o 'ppid=' -p $$
2268
$ ps -o 'cmd=' -p 2268
gnome-terminal
sshd: username@pts/4
. Nota Sto usando PuTTY per connettermi alla macchina. In sshd
realtà è l'emulatore di terminale?
Digitare printenv
dalla finestra del terminale per visualizzare tutte le variabili della sessione aperta.
Digitare echo $COLORTERM
dalla finestra del terminale. NOTA: questo non funziona con tutti i terminali, uno simile sakura
non lo riporta.
root@terrance-Linux:~# echo $COLORTERM
gnome-terminal
quello sotto è da un aterm
terminale.
root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm
cat /etc/alternatives/x-terminal-emulator | grep exec
Uscita campione:
exec ( 'gnome-terminal', @ args);
C'è la risposta per il mio sistema: gnome-terminal .
Quindi, digitando gnome-terminal
nel mio terminale ora si aprirà un'altra finestra terminale identica.
Semplice risposta. Funziona sia per console o ssh.
Esempio per terminale a caratteri semplici:
ssh username@systemname
echo $TERM
dumb
ti dice che non puoi aprire le app della GUI su quella connessione
Esempio per xterm (funziona anche con PuTTY / Xming su Windows)
ssh -Y username@systemname -- omit this if using PuTTY --
echo $TERM
xterm
significa che puoi usare i comandi della GUI come aprire l'editor leafpad o il file manager nautilus.
Sulla console è lo stesso:
Open terminal window
echo $TERM
xterm
TERM
non è una variabile che definisce l'emulatore di terminale predefinito, ma piuttosto una che definisce le capacità di quella corrente. Ad esempio, l'impostazione della variabile su "xterm-color" consente a qualsiasi programma in esecuzione nel terminale di sapere che il terminale corrente dovrebbe comprendere i colori; impostandolo su "linux" dice ai programmi che questo dovrebbe essere un VT; ecc.