Come posso verificare quale terminale sto usando?


23

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?


5
cosa intendi con quale ? Fai clic su Aiuto -> Informazioni su questo?
JoKeR,

3
Quale terminale indica il programma terminale o la shell?
heemayl,

Risposte:


24

TL; DR

  • per trovare l'uso della shell attualmente in esecuzione ls -l /proc/$$/exe
  • per trovare il terminale attualmente in esecuzione, utilizzare xprop _NET_WM_PID WM_CLASS. Il valore di pidlater può essere passato al ps -p <pid> -o argscomando.
  • 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

Shell vs Terminal

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.

Ottenere le informazioni sulla shell

A ciascun utente è assegnata una shell predefinita /etc/passwdper 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 $SHELLnon 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/dasho addirittura /bin/bashnon è 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.


Ottenere informazioni sul terminale

Possiamo iniziare con le variabili di ambiente. Molti terminali sembrano mascherarsi come xtermcompatibili, come riportato da echo $TERMo 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_CLASSproprietà. 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_CLASSproprietà 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 Aboutfinestra di dialogo della finestra stessa. Eccezione a quella regola è xterm.


O_o $SHELL, certo
AB,

Eek. Perché usi la gente ps | grep? ps -p $$! Oppure, semplicemente per il comando, ps -p $$ -o cmd=.
Muru,

@muru perché sono un utente meno esperto di te e non ho memorizzato tutti i flag ps> _ <senza mezzi termini
Sergiy Kolodyazhnyy il

2
Nemmeno io, ma ps | grepè solo una cattiva forma. La maggior parte di ciò che puoi grep, può effettivamente essere ottenuto da pssolo o da altri strumenti.
Muru,

NOTA: ho aggiornato la mia risposta, dal momento che questa domanda non era inizialmente chiara e alcune parti richiedono un po 'di background; nel tempo ho anche capito che ci sono modi migliori per invocare i comandi.
Sergiy Kolodyazhnyy il

12

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'.

2
cat /etc/alternatives/x-terminal-emulator | grep exec
Sergiy Kolodyazhnyy,

C'è un'utilità che devo installare? Ottengo uno Binary file (standard input) matchesoupdate-alternatives: error: unknown argument
Terrance il

Non importa, lo è--config
Terrance,

1
Non hai bisogno sudo. Usaupdate-alternatives --display x-terminal-emulator
muru il

Per la versione breve potresti prendere in considerazione l'utilizzo file /etc/alternatives/x-terminal-emulatorper ottenere la destinazione di questo collegamento simbolico invece di utilizzarla cat. L' fileutilità deve essere installata sulla maggior parte dei sistemi e può essere utilizzata per trovare l'eseguibile di destinazione. catsul 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.).
chris544,

9

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

1
Quando eseguo questo comando ottengo sshd: username@pts/4. Nota Sto usando PuTTY per connettermi alla macchina. In sshdrealtà è l'emulatore di terminale?
user3731622

3

Digitare printenvdalla finestra del terminale per visualizzare tutte le variabili della sessione aperta.

Digitare echo $COLORTERMdalla finestra del terminale. NOTA: questo non funziona con tutti i terminali, uno simile sakuranon lo riporta.

root@terrance-Linux:~# echo $COLORTERM
gnome-terminal

quello sotto è da un atermterminale.

root@terrance-Linux:~$ echo $COLORTERM
rxvt-xpm

echo $ COLORTERM in sakura riporta in bianco
Sergiy Kolodyazhnyy il

@Serg grazie. Sembra quindi una variante di xterm.
Terrance,

@Serg ti stai solo chiedendo se ti piace Sakura? E cosa ti attrae?
Terrance,

Va bene, niente di speciale, abbastanza semplicistico. Ho provato una varietà di emulatori di terminali: terminator, roxterm, tilde, quello a discesa (ho dimenticato come si chiama, qualcosa che inizia con R). Immagino sia un compromesso tra xterm e gnome-terminal
Sergiy Kolodyazhnyy,

@Serg Ah, è bello saperlo. Lo controllerò. :-) Sono sempre alla ricerca di un buon terminale che funzioni con il mio script keepalive che manda loro le chiavi xdotool.
Terrance,

3

Se vuoi solo il nome del programma terminale, molto probabilmente lo troverai in Aiuto> Informazioni.


0
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-terminalnel mio terminale ora si aprirà un'altra finestra terminale identica.

fonti:


-1

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

TERMnon è 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.
Cybolic,
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.