ตัวแปรสภาพแวดล้อม $ DISPLAY คืออะไร


74

ฉันยังใหม่กับการเขียนสคริปต์เชลล์ ฉันไม่เข้าใจว่า$DISPLAYตัวแปรด้านสิ่งแวดล้อมคืออะไร

ฉันมี Ubuntu 13.10 และฉันใช้/bin/bashเชลล์ ฉันมีสองจอภาพ

คำถาม:

  1. คำสั่งecho $DISPLAYจะพิมพ์:0.0บนเครื่องของฉัน (บนจอภาพทั้งสอง) สิ่งนี้หมายความว่า?

  2. ในกรณีใด$DISPLAYตัวแปรจะว่างเปล่าหรือเป็นโมฆะ?

  3. มีบทความหรือแบบฝึกหัดในเรื่องนี้หรือไม่?


วันนี้echo $DISPLAYกำลังพิมพ์:0NOT:0.0
Chandrayya GK

ตรวจสอบสิ่งนี้จะช่วยในกรณีที่ว่างเปล่าหรือมีข้อผิดพลาด: askubuntu.com/questions/432610/…
Maythux

คำตอบ:


86

คำวิเศษในระบบ X window คือ DISPLAY จอแสดงผลประกอบด้วย (ย่อลง) จาก:

  • คีย์บอร์ด
  • หนู
  • และหน้าจอ

จอแสดงผลได้รับการจัดการโดยโปรแกรมเซิร์ฟเวอร์หรือที่เรียกว่าเซิร์ฟเวอร์ X เซิร์ฟเวอร์ทำหน้าที่แสดงความสามารถให้กับโปรแกรมอื่นที่เชื่อมต่ออยู่

รีโมตเซิร์ฟเวอร์รู้ว่าต้องเปลี่ยนเส้นทางทราฟฟิกเครือข่าย X ผ่านนิยามของตัวแปรสภาพแวดล้อม DISPLAY ซึ่งโดยทั่วไปจะชี้ไปที่เซิร์ฟเวอร์ X Display ที่อยู่ในคอมพิวเตอร์ของคุณ

ค่าของตัวแปรสภาพแวดล้อมการแสดงผลคือ:

hostname:D.S

ที่อยู่:

ชื่อโฮสต์เป็นชื่อของคอมพิวเตอร์ที่เซิร์ฟเวอร์ X ทำงาน ชื่อโฮสต์ที่ละเว้นหมายถึง localhost

D คือหมายเลขลำดับ (โดยปกติคือ 0) สามารถเปลี่ยนแปลงได้หากมีจอภาพหลายจอเชื่อมต่อกับคอมพิวเตอร์หนึ่งเครื่อง

S คือหมายเลขหน้าจอ จอแสดงผลสามารถมีได้หลายหน้าจอ มักจะมีเพียงหน้าจอเดียวโดยที่ 0 เป็นค่าเริ่มต้น

ตัวอย่างของค่า

localhost:4
google.com:0
:0.0

hostname:D.Sหมายถึงหน้าจอ S บนจอแสดงผล D ของชื่อโฮสต์โฮสต์ เซิร์ฟเวอร์ X สำหรับจอแสดงผลนี้กำลังรับฟังที่พอร์ต TCP 6000 + D

host/unix:D.Sหมายถึงหน้าจอ S บนจอแสดงผล D ของโฮสต์โฮสต์ เซิร์ฟเวอร์ X สำหรับจอแสดงผลนี้กำลังรับฟังที่ซ็อกเก็ตโดเมน UNIX /tmp/.X11-unix/XD (ดังนั้นจึงสามารถเข้าถึงได้จากโฮสต์เท่านั้น)

:D.S เทียบเท่ากับ host / unix: DS โดยที่ host คือชื่อโฮสต์โลคัล

: 0.0 หมายความว่าเรากำลังพูดถึงหน้าจอแรกที่เชื่อมต่อกับจอแสดงผลแรกของคุณในโฮสต์ท้องถิ่นของคุณ

อ่านเพิ่มเติมที่นี่และที่นี่และที่นี่

จากหน้า man X (7):

จากมุมมองของผู้ใช้เซิร์ฟเวอร์ X ทุกตัวมีชื่อที่แสดงของแบบฟอร์ม:

ชื่อโฮสต์: displaynumber.screennumber

แอปพลิเคชันนี้ใช้ข้อมูลนี้เพื่อพิจารณาว่าควรเชื่อมต่อกับเซิร์ฟเวอร์อย่างไรและหน้าจอใดที่ควรใช้เป็นค่าเริ่มต้น (บนหน้าจอที่มีจอภาพหลายจอ):

ชื่อโฮสต์ชื่อโฮสต์ระบุชื่อของเครื่องที่เชื่อมต่อจอแสดงผล หากไม่ได้ระบุชื่อโฮสต์จะใช้วิธีที่มีประสิทธิภาพสูงสุดในการสื่อสารกับเซิร์ฟเวอร์ในเครื่องเดียวกัน displaynumber วลี "display" มักใช้เพื่ออ้างถึงชุดของจอภาพที่ใช้แป้นพิมพ์และตัวชี้ทั่วไป (เมาส์แท็บเล็ต ฯลฯ ) เวิร์คสเตชั่นส่วนใหญ่มักจะมีเพียงคีย์บอร์ดเดียวเท่านั้นดังนั้นจึงมีจอแสดงผลเพียงจอเดียว อย่างไรก็ตามระบบที่มีผู้ใช้หลายคนที่มีขนาดใหญ่กว่ามักมีจอแสดงผลหลายจอเพื่อให้สามารถทำงานกราฟิกได้มากกว่าหนึ่งคนในคราวเดียว เพื่อหลีกเลี่ยงความสับสนจอแสดงผลแต่ละจอบนเครื่องจะถูกกำหนดหมายเลขแสดงผล (เริ่มต้นที่ 0) เมื่อเซิร์ฟเวอร์ X สำหรับจอแสดงผลเริ่มทำงาน ต้องแสดงหมายเลขที่แสดงในชื่อที่แสดงเสมอ screennumber จอแสดงผลบางตัวใช้แป้นพิมพ์และตัวชี้ร่วมกันระหว่างจอภาพสองหน้าขึ้นไป เนื่องจากจอภาพแต่ละจอมีชุดหน้าต่างของตัวเองแต่ละหน้าจอจะถูกกำหนดหมายเลขหน้าจอ (เริ่มต้นที่ 0) เมื่อเซิร์ฟเวอร์ X สำหรับจอแสดงผลเริ่มต้นขึ้น หากไม่ได้ระบุหมายเลขหน้าจอระบบจะใช้หน้าจอ 0


เมื่อใดที่ $ DISPLAY นี้จะว่างเปล่าหรือว่างเปล่า
Chandrayya GK

โดยปกติสิ่งนี้จะต้องไม่เกิดขึ้นเว้นแต่ว่ามีปัญหาในจอแสดงผลของคุณ .. ส่วนใหญ่การรีสตาร์ทตัวจัดการหน้าจอของคุณจะแก้ปัญหาได้ แต่นี่ไม่ใช่การกระทำเริ่มต้น
Maythux


@ChandrayyaGK ตัวอย่างเช่นเมื่อฉันไม่ได้ใช้สภาพแวดล้อมเดสก์ทอปใด ๆ เช่น GNOME หรือ KDE แต่โดยตรงเข้าสู่ระบบด้วย TTY (ชอบ/dev/tty1) $DISPLAYผมได้ว่างเปล่า
Franklin Yu

@Maythux บางครั้งจำนวนหน้าจอที่ดูเหมือนว่าจะถูกมองข้ามเมื่อเป็น 0. GNOME ของฉันให้สำหรับ:0 $DISPLAY
Franklin Yu

10

คำตอบที่มีอยู่ล้มเหลวในการระบุภาพที่กว้างขึ้น

หากคุณไม่ได้ใช้สภาพแวดล้อมแบบกราฟิก (เช่นคุณกำลังเข้าสู่ระบบคอนโซลโดยไม่มีหน้าต่าง ฯลฯ หรือคุณเข้าสู่ระบบจากระยะไกลจากเทอร์มินัลแบบข้อความอย่างเดียวผ่าน SSH หรือคล้ายกันเช่นจากคอมพิวเตอร์ Windows ที่ใช้ PuTTY) ไม่มี GUI ที่เกี่ยวข้องและDISPLAYโดยทั่วไปจะไม่ได้รับการตั้งค่า วิธีการสื่อสารกับคอมพิวเตอร์เพียงอย่างเดียวของคุณคือบรรทัดคำสั่ง (แม้ว่าอาจมีวิธีที่จะเปลี่ยนเป็นเซสชัน GUI หากคุณรู้วิธี)

หากคุณกำลังลงชื่อเข้าใช้คอนโซลด้วยส่วนต่อประสานกราฟิก (บน Ubuntu โดยทั่วไปจะใช้ GDM greeter) หรือใช้เทอร์มินัลกราฟิก (เช่นจากคอมพิวเตอร์ Windows ที่ใช้ eXceed หรือ mobaX หรือซอฟต์แวร์เดสก์ท็อประยะไกลเช่นไคลเอนต์ VNC) DISPLAYตัวแปรถูกตั้งค่าโดยโปรแกรมที่จัดการเซสชันกราฟิกของคุณเพื่อระบุถึงไคลเอ็นต์กราฟิกที่อุปกรณ์ I / O ที่จะเชื่อมต่อ

ตามเนื้อผ้า GUI บนคอมพิวเตอร์อูบุนตูกำลังเรียกใช้ X.org ซึ่งเป็นการนำ X11 มาใช้แม้จะเพิ่งได้รับการแนะนำให้รู้จักกับ Mirical มาแทนที่ล่าสุด และมากยิ่งขึ้นเมื่อเร็ว ๆ นี้ผมเชื่อว่าเมียจะถูกปล่อยปละละเลยในโครงการอื่นที่มีเป้าหมายที่คล้ายกันในวงกว้างที่เรียกว่า Wayland การแทนที่เหล่านี้มีจุดประสงค์เพื่อลดความซับซ้อนของสแต็ก X11 เต็มรูปแบบซึ่งเราจะไม่เข้าไปที่นี่ - พวกเขาปฏิบัติตามDISPLAYอนุสัญญาเดียวกันซึ่งหลังจากทั้งหมดที่เรากำลังพูดถึงอยู่ที่นี่

ใน X11 ส่วนโฮสต์ของDISPLAYอาจเป็นเซิร์ฟเวอร์ระยะไกลและคุณจะใช้คอมพิวเตอร์ Ubuntu ของคุณเป็น "กราฟิกเทอร์มินัล" เพื่อเข้าถึงไฟล์และโปรแกรมบนเซิร์ฟเวอร์ระยะไกลนั้น (ในกรณีนี้คอมพิวเตอร์ของคุณคือ "เซิร์ฟเวอร์" ซึ่งทำหน้าที่เป็นแป้นพิมพ์ เมาส์และอุปกรณ์แสดงผลอย่างน้อยหนึ่งรายการสำหรับโปรแกรม "ไคลเอนต์" ที่ทำงานบนเซิร์ฟเวอร์ระยะไกล ... ) โดยทั่วไปเซิร์ฟเวอร์ X11 (หรือ Mir หรือ Wayland) และโปรแกรมไคลเอนต์ (ผู้จัดการเดสก์ท็อปและไคลเอนต์แบบกราฟิกต่าง ๆ เช่นเว็บเบราว์เซอร์ไคลเอนต์อีเมลโปรแกรมปฏิทิน ฯลฯ ) ทั้งหมดทำงานบนคอมพิวเตอร์ของคุณ สิ่งนี้ถูกระบุโดยส่วน "เซิร์ฟเวอร์" ของDISPLAYค่าซึ่งโดยปกติจะเป็นค่าว่าง (ซึ่งแสดงถึงค่าเริ่มต้นlocalhost)

เซิร์ฟเวอร์ X11 อาจเรียกใช้หนึ่งหรือมากกว่าเซสชันกราฟิก - ตัวอย่างเช่นการเข้าสู่ระบบคอนโซลของคุณและเซสชั่น VNC ระยะไกลสามารถทำงานได้ในเวลาเดียวกัน ในกรณีนี้ (หากจัดการโดยอินสแตนซ์เซิร์ฟเวอร์ X11 เดียวกัน) คุณมี "display" มากกว่าหนึ่งรายการในข้อกำหนด X11 ในทางปฏิบัติหนึ่งเซสชัน (เหตุการณ์การเข้าสู่ระบบหนึ่งครั้งและอินสแตนซ์เดสก์ท็อปที่เกิดจากสิ่งนี้) คือหนึ่งจอแสดงผลใน X11

หนึ่งหน้าจอดังกล่าวสามารถมีหนึ่งหรือหลายหน้าจอ ตามเนื้อผ้านี่หมายถึงจอภาพหนึ่งแม้ว่าสถาปัตยกรรมดั้งเดิมมีลักษณะที่โชคร้ายบางอย่างเช่นไม่สามารถย้ายหน้าต่างจากหน้าจอหนึ่งไปยังอีกหน้าจอหนึ่งได้ ส่วนเสริมเช่น Xinerama และ Xrandr ทำให้สถานการณ์สับสนมากขึ้นจนถึงจุดที่หน้าจอเดียวเชื่อมต่อจอภาพหลายจอในรูปแบบต่างๆ

หากคุณเล่นกับระบบหลายจอภาพคุณอาจค้นพบว่าคุณสามารถจัดเรียงจอภาพได้หลายวิธีและจบลงด้วยพื้นที่สี่เหลี่ยมที่จอภาพของคุณแสดงบางส่วนของมันและส่วนอื่น ๆ ไม่ได้ถูกกำหนดให้กับจอภาพใด ๆ นี่คือ "หน้าจอ" ที่ X11 สร้างขึ้นและถ้าคุณมีการ์ดแสดงผลมากกว่าหนึ่งใบคุณสามารถมีหน้าจอหลายหน้าจอเหล่านี้แต่ละหน้าจอที่กำหนดให้กับหนึ่งหรือมากกว่าหนึ่งจอภาพ (หรือในทางทฤษฎีทำงานโดยไม่มีจอภาพ Xvfb คุณสามารถรัน X11 โดยไม่มีจอภาพใด ๆ เพียงแค่ทำแผนที่ GUI ไปยังพื้นที่หน่วยความจำไม่ว่าจะด้วยวัตถุประสงค์ใด)


เมียร์ถูกทอดทิ้งพร้อมกับความสามัคคี เป็นเวลานาน lightdm มากกว่า gdm เป็นค่าเริ่มต้น แต่อาจเป็นส่วนหนึ่งของคำตอบของคุณที่ถูกต้องอีกครั้งเหมือนเดิมก่อนขึ้นของ Unity! ฉันใช้ MATE ดังนั้นฉันจึงไม่สามารถตรวจสอบได้เล็กน้อย ...
Zanna

ฉันใช้ Linux จากคอนโซล (ไม่มี windows) และนั่นอธิบายทุกอย่าง สมเหตุสมผลแล้ว: p
Jean-Francois T.

3

จากhttps://help.ubuntu.com/community/EnvironmentVariables :

ตัวแปร - แสดงผล

ตัวอย่างค่า:

:0.0
localhost:10.0
terminal01:0.0

มีไว้เพื่ออะไร

ตัวแปรนี้ใช้เพื่อระบุถึงแอปพลิเคชันกราฟิกที่จะแสดงส่วนติดต่อผู้ใช้แบบกราฟิกที่แท้จริงค่าประกอบด้วย 3 ส่วน: ชื่อโฮสต์ตามด้วยเครื่องหมายจุดคู่ (:), หมายเลขแสดงผลตามด้วยจุด (.) และหน้าจอ จำนวน.

ส่วนชื่อโฮสต์สามารถใช้ในการส่งออกกราฟิกไปยังเครื่องระยะไกลผ่านเครือข่าย สามารถละเว้นได้เมื่อเอาต์พุตมีความหมายสำหรับเซิร์ฟเวอร์ X ที่รันบนเครื่องโลคัล หมายเลขที่แสดงอนุญาตให้เลือกระหว่างเซิร์ฟเวอร์ X หลายเครื่องที่ทำงานบนเครื่องเดียวกัน (Ubuntu ใช้เซิร์ฟเวอร์ X หลายเครื่องเพื่อเปิดใช้งานเซสชันกราฟิกเดสก์ท็อปหลายรายการ)

แม้ว่าหมายเลขหน้าจอจะใช้เพื่อเลือกระหว่างหน้าจอแบบฟิสิคัลหลายหน้าจอที่จัดการโดยเซิร์ฟเวอร์ X เดียวกัน แต่แทบจะไม่ได้ตั้งค่าเป็นสิ่งอื่นใดนอกจาก "0" ทุกวันนี้ การตั้งค่าตัวแปรสภาพแวดล้อม "DISPLAY" ด้วยตนเองนั้นไม่ค่อยมีความต้องการในปัจจุบันเนื่องจากสามารถปรับได้โดยอัตโนมัติและชาญฉลาดโดยแอพพลิเคชั่นมากมายเช่น "GDM" และ "SSH" เมื่อจำเป็น


3

echo $ DISPLAY จะพิมพ์: 0.0 บนเครื่องของฉัน (บนจอภาพทั้งสอง) หมายความว่าอะไร?

: 0.0 หมายถึงหมายเลขที่แสดง 0 และหมายเลขหน้าจอ 0

$ DISPLAY ในกรณีใดจะว่างเปล่าหรือเป็น NULL

ในกรณีที่เกิดข้อผิดพลาดใน $ DISPLAY ของคุณและสิ่งนี้ไม่ได้เกิดขึ้นตามปกติ

มีบทความหรือแบบฝึกหัดในเรื่องนี้หรือไม่?

บทเรียนและทรัพยากรบางอย่างอยู่ที่นี่:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.