Cos'è la variabile d'ambiente $ DISPLAY?


75

Sono nuovo di shell scripting. Non capisco quale sia la $DISPLAYvariabile ambientale.

Ho Ubuntu 13.10 e utilizzo la /bin/bashshell. Ho due monitor.

Domande:

  1. Il comando echo $DISPLAYstampa :0.0sulla mia macchina (su entrambi i monitor). Cosa significa questo?

  2. In quali casi la $DISPLAYvariabile sarà vuota o NULL?

  3. Ci sono articoli o tutorial su questo?


Oggi echo $DISPLAYsta stampando :0NOT:0.0
Chandrayya GK l'

verificare che ciò possa essere d'aiuto in caso di spazi
Maythux

Risposte:


86

La parola magica nel sistema X Window è DISPLAY. Un display è (semplificato) di:

  • una tastiera,
  • un topo
  • e uno schermo.

Un display è gestito da un programma server, noto come X server. Il server serve a mostrare le capacità ad altri programmi che si connettono ad esso.

Il server remoto sa dove deve reindirizzare il traffico di rete X tramite la definizione della variabile di ambiente DISPLAY che generalmente punta a un server X Display situato sul computer locale.

Il valore della variabile di ambiente di visualizzazione è:

hostname:D.S

dove:

hostname è il nome del computer su cui è in esecuzione il server X. Un nome host omesso indica localhost.

D è un numero progressivo (solitamente 0). Può essere variata se sono presenti più schermi collegati a un computer.

S è il numero dello schermo. Un display può effettivamente avere più schermi. Di solito c'è solo una schermata, dove 0 è l'impostazione predefinita.

Esempio di valori

localhost:4
google.com:0
:0.0

hostname:D.Sindica la schermata S sul display D del nome host host; il server X per questo display è in ascolto sulla porta TCP 6000 + D.

host/unix:D.Sindica la schermata S sul display D dell'host host; il server X per questo display è in ascolto sul socket di dominio UNIX /tmp/.X11-unix/XD (quindi è raggiungibile solo dall'host).

:D.S è equivalente a host / unix: DS, dove host è il nome host locale.

: 0.0 significa che stiamo parlando della prima schermata collegata al tuo primo display nell'host locale

Leggi di più qui e qui e qui .

Da una pagina man X (7):

Dal punto di vista dell'utente, ogni server X ha un nome visualizzato del modulo:

hostname: displaynumber.screennumber

Queste informazioni vengono utilizzate dall'applicazione per determinare come dovrebbe connettersi al server e quale schermata dovrebbe utilizzare per impostazione predefinita (sui display con più monitor):

nome host Il nome host specifica il nome della macchina a cui il display è fisicamente collegato. Se non viene fornito il nome host, verrà utilizzato il modo più efficiente di comunicare con un server sulla stessa macchina. displaynumber La frase "display" viene generalmente utilizzata per fare riferimento alla raccolta di monitor che condividono una tastiera e un puntatore comuni (mouse, tablet, ecc.). La maggior parte delle workstation tende ad avere solo una tastiera e, quindi, un solo display. I sistemi più grandi e multiutente, tuttavia, hanno spesso diversi display in modo che più di una persona possa eseguire lavori grafici contemporaneamente. Per evitare confusione, ad ogni display su una macchina viene assegnato un numero di display (che inizia da 0) quando viene avviato il server X per quel display. Il numero visualizzato deve essere sempre indicato in un nome visualizzato. screennumber Alcuni display condividono una singola tastiera e un puntatore tra due o più monitor. Poiché ogni monitor ha il proprio set di finestre, a ogni schermata viene assegnato un numero di schermata (a partire da 0) all'avvio del server X per quella schermata. Se non viene indicato il numero dello schermo, verrà utilizzato lo schermo 0.


Quando questo $ DISPLAY sarà null o BLANK.
Chandrayya GK,

In normale Questo non deve accadere a meno che non ci sia un problema nel display. Principalmente un riavvio del display manager risolverà il problema. Ma questa non è un'azione predefinita.
Maythux,


@ChandrayyaGK Ad esempio, quando non sto usando alcun ambiente desktop come GNOME o KDE, ma accedo direttamente con TTY (come /dev/tty1), ho ottenuto il vuoto $DISPLAY.
Franklin Yu,

@Maythux A volte il numero di schermo sembra essere omesso quando essere 0. Il mio GNOME dà :0per $DISPLAY.
Franklin Yu,

10

Le risposte esistenti non riescono ad affrontare il quadro generale.

Se non si utilizza un ambiente grafico (ad es. Si accede alla console di sistema senza finestre, ecc. Oppure si accede in remoto da un terminale di solo testo su SSH o simile, ad esempio da un computer Windows che esegue PuTTY) nessuna GUI è coinvolta e DISPLAYin genere non sarà impostata. L'unico mezzo per comunicare con il computer è la riga di comando (anche se ci possono essere modi per ruotare in una sessione della GUI se sai come).

Se si accede alla console con un'interfaccia grafica (su Ubuntu, in genere viene utilizzato il greeter GDM) o si utilizza un terminale grafico (come da un computer Windows che esegue eXceed o mobaX o un software desktop remoto come un client VNC) il DISPLAYviene impostata dal programma che gestisce la sessione grafica per indicare ai client grafici a quali dispositivi I / O connettersi.

Tradizionalmente, la GUI su un computer Ubuntu eseguiva X.org, un'implementazione X11, sebbene più recentemente, una sostituzione modernizzata chiamata Mir fu introdotta da Canonical; e ancora più di recente, credo che Mir sarà abbandonato a favore di un altro progetto con obiettivi sostanzialmente simili chiamato Wayland . Queste sostituzioni hanno lo scopo di ridurre la complessità di uno stack X11 completo, che non entreremo qui - aderiscono alla stessa DISPLAYconvenzione, che è dopo tutto ciò di cui stiamo discutendo qui.

Su X11, la parte host di DISPLAYpotrebbe essere un server remoto e useresti il ​​tuo computer Ubuntu come "terminale grafico" per accedere a file e programmi su quel server remoto (nel qual caso il tuo computer è il "server" che serve una tastiera , un mouse e uno o più dispositivi di visualizzazione ai programmi "client" in esecuzione sul server remoto ...). Più comunemente, il server X11 (o Mir o Wayland) e i programmi client (un desktop manager e vari client grafici come un browser web, un client di posta elettronica, un programma di calendario, ecc.) Sono tutti eseguiti sul tuo computer. Ciò è indicato dalla parte "server" del DISPLAYvalore, che in quest'ultimo caso è in genere vuota (il che implica il valore predefinito localhost).

Un server X11 può eseguire una o più sessioni grafiche, ad esempio il login della console e una sessione VNC remota potrebbero essere in esecuzione contemporaneamente. In questo caso (se sono gestiti dalla stessa istanza del server X11) hai più di un "display" in termini X11. In pratica, una sessione (un evento di accesso e l'istanza desktop generata da questo) è un display in X11.

Uno di questi display può avere uno o più schermi. Tradizionalmente, questo significava un monitor, sebbene l'architettura originale avesse alcuni tratti sfortunati come l'incapacità di spostare una finestra da uno schermo all'altro. Componenti aggiuntivi come Xinerama e Xrandr hanno ulteriormente confuso la situazione al punto in cui uno schermo collega spesso più monitor in vari modi.

Se hai giocato con sistemi a più monitor, probabilmente hai scoperto che puoi disporre i monitor in vari modi e finire con un'area rettangolare in cui i monitor visualizzano alcune parti di esso e altre parti non sono assegnate a nessun monitor. Questo è lo "schermo" creato da X11 e se si dispone di più di una scheda video, è possibile avere più di questi schermi, ciascuno assegnato a uno o più monitor (o in teoria, in esecuzione senza monitor; Xvfb lo sfrutta per consentire per eseguire X11 senza monitor, semplicemente mappando la GUI su un'area di memoria per qualsiasi scopo).


Mir è stato davvero abbandonato insieme a Unity. Per molto tempo lightdm piuttosto che gdm era l'impostazione predefinita, ma forse quella parte della tua risposta è tornata corretta come prima dell'ascesa di Unity! Uso MATE, quindi non posso controllare banalmente ...
Zanna,

Stavo eseguendo Linux dalla console (senza Windows) e questo spiega tutto. Ha effettivamente senso: p
Jean-Francois T.

3

Da https://help.ubuntu.com/community/EnvironmentVariables :

Variabile- DISPLAY

Esempio di valori:

:0.0
localhost:10.0
terminal01:0.0

A cosa serve?

Questa variabile viene utilizzata per indicare alle applicazioni grafiche in cui visualizzare l'interfaccia utente grafica effettiva, il valore è composto da 3 parti: un nome host seguito da due punti (:), un numero visualizzato seguito da un punto (.) E una schermata numero.

La parte del nome host può essere utilizzata per inviare l'output grafico a una macchina remota sulla rete. Può essere omesso quando l'output è destinato a un server X in esecuzione sul computer locale. Il numero visualizzato consente di selezionare tra più server X in esecuzione sullo stesso computer (Ubuntu utilizza più server X per abilitare più sessioni desktop grafiche).

Sebbene il numero dello schermo sia usato per selezionare tra più schermi fisici gestiti dallo stesso server X, oggigiorno è raramente impostato su un valore diverso da "0". Al giorno d'oggi raramente è necessario impostare manualmente il valore della variabile d'ambiente "DISPLAY" poiché può essere regolato automaticamente e in modo intelligente da molte applicazioni come "GDM" e "SSH" quando necessario.


3

echo $ DISPLAY stamperà: 0.0 sulla mia macchina (su entrambi i monitor). Cosa significa?

: 0.0 indica il numero di visualizzazione 0 e il numero di schermata 0

In tal caso $ DISPLAY sarà vuoto o NULL?

In caso di errore nel $ DISPLAY e questo non accade normalmente

Ci sono articoli o tutorial su questo?

Alcuni tutorial e risorse sono disponibili qui:

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.