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


คำตอบ:


54
xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/'

คำสั่งxdpyinfoแสดงข้อมูลต่าง ๆ เกี่ยวกับเซิร์ฟเวอร์ X ของคุณ มันเขียนจำนวนมากของสิ่งที่จะออกมาตรฐาน แต่เราต้องการเพียงบรรทัดขึ้นต้นด้วยคำว่าทำให้เราใช้dimensions grepในที่สุดเราก็ใช้sedในการทำความสะอาดผลลัพธ์


หากคุณต้องการมิติแกน x และ y แยกกันคุณสามารถทำสิ่งต่อไปนี้ ขั้นแรกให้วางผลลัพธ์ของคำสั่งด้านบนลงในตัวแปรโดยใช้$( )ไวยากรณ์ (เช่นDIMENSIONS=$(xdpyinfo ...) แล้วใช้sedอีกครั้งที่จะได้รับที่สอง: และWIDTH=$(echo $DIMENSIONS | sed -r 's/x.*//') HEIGHT=$(echo $DIMENSIONS | sed -r 's/.*x//')
mneri

xdpyinfo/dev/nullพิมพ์ข้อความผิดพลาดถ้ามันไม่สามารถเข้าถึงข้อมูลเพื่อการเปลี่ยนเส้นทางข้อผิดพลาด xdpyinfo 2> /dev/nullด้วยเหตุนี้คุณอาจต้องการที่จะเพิ่มการเปลี่ยนเส้นทางข้อผิดพลาด: ดังนั้นลูกศิษย์แบบเต็มจะมีลักษณะเช่นนี้: xdpyinfo 2> /dev/null | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/'. สิ่งนี้จะทำให้สคริปต์ของคุณแข็งแกร่งขึ้น
mneri

28

xdpyinfo | grep dimensionsจะให้ความละเอียดทั้งหมดแก่คุณหากคุณมีจอภาพหลายจอมันจะเป็นผลรวมของทั้งหมด xrandr --currentจะให้ความละเอียดสำหรับแต่ละจอภาพ

ฉันใช้ตัวอย่างนี้เพื่อค้นหาความละเอียดสูงสุดที่เป็นไปได้สำหรับ rDesktop โดยไม่ต้องไปเต็มหน้าจอ:

Xaxis=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f1)

Yaxis=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f2)

เอาท์พุท:

Xaxis = 1280
Yaxis = 1024

ลบหน้าต่างตกแต่ง (มากหรือน้อย):

MaxRes=$(($Xaxis-5))"x"$(($Yaxis-25))

เอาท์พุท:

MaxRes = 1275x999

ไหนคือความละเอียดสูงสุดสำหรับ rDesktop โดยไม่ต้องแสดงเต็มหน้าจอ

คำสั่งสิ้นสุด:

rdesktop -u $User -P -z -5 -g $MaxRes $Host &

มันใช้งานได้ดี แต่ฉันยังไม่ได้ทดสอบอย่างละเอียด

อีกตัวอย่างหนึ่งสำหรับ screencast ด้วยavconv:

avconv -f x11grab -r 15 -s `xrandr --current | grep  '*' | uniq | awk '{print $1}'` -i :0.0 -c:v libx264 ./output.mp4

มันบอกว่า>xdpyinfo: Unable to open display "".
ถึงกระ

คุณจะหาโหมดที่มีให้เปลี่ยนได้อย่างไร?
CMCDragonkai

หากคุณไม่จำเป็นต้องลบการตกแต่งหน้าต่าง (ฯลฯ ) คุณสามารถทำได้ด้วยการซับในrdesktop [other_args] -g $(xrandr --current | grep '*' | uniq | awk '{print $1}')ครั้งเดียว
c24w

ไม่ใช่ผลรวมของจอภาพหลายจอ มันคือขนาดของกล่องที่มีขอบเขตซึ่งมีมอนิเตอร์ทั้งหมด
Dennis Williamson

xrandr --current | grep '*' | awk -v line="$SCREEN" 'NR==line{print $1}' | cut -d 'x' -f1ถ้าคุณต้องการระบุหน้าจอ (พร้อมการตั้งค่าจอภาพหลายจอ) ( SCREENมีการจัดทำดัชนี 1 รายการ)
SapuSeven

5

คุณสามารถใช้xrandr -qคำสั่ง จากนั้นคุณสามารถสร้างเชลล์สคริปต์ได้ถ้าต้องการ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งให้ไปที่นี่หรือพิมพ์man xrandr


2
#############################################
## ฉันใช้สิ่งนี้กับโปรแกรมบันทึกวิดีโอ
ขนาดหน้าต่าง # - ตัวเลือกราก - ข้อมูลในหน้าต่างรูทของหน้าจอ
echo $ (xwininfo -root | grep 'geometry' | awk '{พิมพ์ $ 2;}')
# เอาต์พุต: 1024x768 + 0 + 0
# height x width + x + y position
######################
## คู่มืออ้างอิง ##
ผู้ชาย xwininfo

ฉันใช้xwininfo -root|sed '/Height/!d;s/.* //'ความสูงและxwininfo -root|sed '/Width/!d;s/.* //'ความกว้าง
ของหวาน

1

xdpyinfoจะทำมันด้วยการแยกบางส่วน มันให้ข้อมูลมากมายซึ่งคุณจะต้องขุดหมายเลขหน้าจอและขนาดจาก


1

สองทางเลือกที่เป็นไปได้ที่สร้างขึ้นโดยรวมคำตอบของ @ user31752 และ @ eliezer-e-vargas

regex ที่ง่ายกว่า:

$ xrandr --current | sed -n 's/.* connected \([0-9]*\)x\([0-9]*\)+.*/\1x\2/p'
1440x900

หรือใช้ตัด:

$ xrandr --current | grep ' connected ' | cut -d ' ' -f 3 | cut -d '+' -f 1
1440x900

การใช้grep '*' | uniqจาก @ eliezer-e-vargas จะได้รับบรรทัดที่แตกต่างกัน (เช่น "1440x900 59.90 * + 59.89") ของเอาต์พุต xrandr ในขณะที่ grep 'เชื่อมต่อ' จะได้รับหนึ่งง่าย (เช่น "เชื่อมต่อ LVDS1 1440x900 + 0 + 0 ..... ")

การใช้ regex โดย @ user31752 นั้นดีดังนั้นบรรทัดที่ฉันใช้จำเป็นต้องใช้ regex ที่ง่ายขึ้นหรือสามารถใช้แทนคำสั่ง cut ที่ง่ายกว่าได้

ตัวอย่างเอาต์พุต xrandr

$ xrandr --current
Screen 0: minimum 320 x 200, current 1440 x 900, maximum 8192 x 8192
LVDS1 connected 1440x900+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
   1440x900      59.90*+  59.89  
   1360x768      59.80    59.96  
   1152x864      60.00  
   1024x768      60.00  
   800x600       60.32    56.25  
   640x480       59.94  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

มีเหตุผลสำหรับใครสักคนที่จะใช้คำสั่งเหล่านี้แทนคำสั่งในEliezer E. Vargasหรือไม่?
สกอตต์

โปรดแก้ไขข้อมูลนั้นเป็นคำตอบของคุณ
Scott

0

เช่นเดียวกับในคำตอบที่ยอมรับ แต่ซับซ้อนน้อยกว่า:

xdpyinfo | grep dimensions

ตัวอย่างผลลัพธ์:

dimensions:    1366x768 pixels (361x203 millimeters)

0

การอ่านข้อมูลหน้าจอมอนิเตอร์

มาตรฐาน vesa มีวิธีการอ่านความละเอียดของหน้าจอมอนิเตอร์

Extended Identification Data (EDID ): มาตรฐานนี้กำหนดรูปแบบข้อมูลเพื่อนำข้อมูลการกำหนดค่ามาใช้เพื่อให้สามารถใช้งานจอภาพได้อย่างเหมาะสม

โดยทั่วไปจอภาพรองรับความละเอียดหลายระดับและรีเฟรช แน่นอนว่าใครบางคนจะชอบมากที่สุด (ทางกายภาพ) หนึ่ง

หากต้องการอ่านข้อมูลมอนิเตอร์นี้ลองใช้วิธีแก้ปัญหาเหล่านี้:

  • EDID-ถอดรหัส

    หากไม่ได้ติดตั้งให้พิมพ์

    sudo apt install edid-decode
    

    จากนั้นอ่านedidไฟล์

    edid-decode /sys/class/drm/card0-eDP-1/edid
    
  • อ่าน EDID

    ติดตั้งด้วย

    sudo apt install read-edid 
    

    จากนั้นอ่านข้อมูล i2c ผ่านหน้าจอมอนิเตอร์และวิเคราะห์ข้อมูล

    sudo get-edid | parse-edid
    
  • Hexdump ข้อมูล edid

    ในกรณีที่ไม่ได้ติดตั้งเครื่องมือ edid คุณสามารถดัมพ์edidไฟล์ hex ได้เช่น:

    hd /sys/class/drm/card0-eDP-1/edid
    

    การเข้ารหัสไฟล์ฐานสิบหกนี้จะดูที่วิกิพีเดียหรือดาวน์โหลดรายละเอียด EDID

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