Score:0

จะเปลี่ยนรหัสทุบตีเพื่อให้ได้ความละเอียดหน้าจอบน Ubuntu โดย xrandr แต่ไม่ต้องใช้ awk ได้อย่างไร

ธง ng

รหัสทุบตีต่อไปนี้ใช้งานได้ดีเพื่อรับและสะท้อนความละเอียด x และ y ของหน้าจอโดยไม่เห็น xrandr:

คุณสามารถรับความละเอียดของหน้าจอปัจจุบันได้ดังนี้:

รับความละเอียด X โดยเรียกใช้:

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

รับความละเอียด Y โดยเรียกใช้:

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

แสดงผลความละเอียด X และ Y โดยเรียกใช้:

เสียงสะท้อน "$X"x"$Y"

หรือ

เสียงสะท้อน "$X"
เสียงสะท้อน "$Y"

จะเปลี่ยนรหัสนี้เพื่อรับความละเอียดหน้าจอบน Ubuntu ได้อย่างไรโดยไม่เห็น xrandr, a โดยไม่ต้องใช้ awk ?

hr flag
IMHO มันสมเหตุสมผลกว่าที่จะเก็บ awk ไว้และสูญเสียคำสั่งอื่น ๆ เช่น `awk '/\*/{split($1,a,"x"); พิมพ์ [2]; ออก}'`
Eddy763 avatar
ng flag
awk ไม่สามารถใช้ได้ในทุกระบบ...
muru avatar
us flag
ไม่มีในระบบ Ubuntu ใด แม้แต่ `ubuntu-minimal` ก็ขึ้นอยู่กับมัน อิมเมจ Ubuntu Docker มาตรฐานซึ่งมีค่อนข้างน้อยก็มีเช่นกัน
Score:4
ธง cn

ประการแรกไม่มีเหตุผลที่จะลบ อึดอัด. มันเร็วมาก เสถียร และทำมาเพื่อสิ่งนี้ อย่างไรก็ตาม คำสั่งของคุณนั้นซับซ้อนโดยไม่จำเป็น คุณสามารถทำได้:

$ xrandr -- ปัจจุบัน | awk '$2~/\*/{print $1}' 
2560x1440

หากคุณต้องการแยก x และ y ให้ทำดังนี้

x=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f1)
y=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f2)
เสียงสะท้อน "$x"
เสียงสะท้อน "$y"

หรือมากกว่านั้น:

$ อ่าน x y < <(xrandr --current | awk '$2~/\*/{sub(/x/," ");print $1,$2}')
$ echo "x:$x y:$y"
x:2560 ย:1440

และหากคุณยืนยันที่จะไม่ใช้ awk ต่อไปนี้คือตัวเลือกอื่นๆ สองสามตัวเลือก:

อ่าน x y < <(xrandr --current | sed -En '/\*/{s/^ *([0-9]+)x([0-9]+).*/\1 \2/p} ')
เสียงสะท้อน "$x"
เสียงสะท้อน "$y"

หรือ

อ่าน x y < <(xrandr --current | perl -lne 'พิมพ์ "$1 $2" ถ้า /^ *([0-9]+)x([0-9]+).*/')
เสียงสะท้อน "$x"
เสียงสะท้อน "$y"

หรือ

อ่าน x y < <(xrandr --current | grep -oP '\d+x\d+' | tr x ' ')
เสียงสะท้อน "$x"
เสียงสะท้อน "$y"

โปรดทราบว่าทั้งหมดนี้ถือว่ามีการเชื่อมต่อเพียงหน้าจอเดียว เช่นเดียวกับแนวทางดั้งเดิมของคุณ

terdon avatar
cn flag
@Eddy763 ไม่ต้องกังวล :) อย่างไรก็ตาม หากคำตอบข้อใดข้อหนึ่งแก้ไขปัญหาของคุณได้ โปรดสละเวลาสักครู่และ [ยอมรับ](//askubuntu.com/help/someone-answers) โดยคลิกที่เครื่องหมายถูกบน ทางซ้าย. นั่นเป็นวิธีที่ดีที่สุดในการแสดงความขอบคุณบนเว็บไซต์ Stack Exchange
hr flag
ตัวเลือกอื่นที่ใช้ `read` อาจเป็นเช่น `IFS=' x' read x y _
terdon avatar
cn flag
@ Eddy763 สุดยอด! ฉันสันนิษฐานว่าเป็นนัยและไม่ต้องการทำซ้ำในทุกวิธีแก้ปัญหา
Score:2
ธง cn

คุณสามารถใช้ตัวดำเนินการไบนารีและ อ่าน:

[[ $(xrandr --ปัจจุบัน) \
    =~ ปัจจุบัน\ ([0-9]+)\ x\ ([0-9]+) \
]] && อ่าน x y <<< "${BASH_REMATCH[@]:1:2}"

เสียงสะท้อน ${x}x${y}

ตัวแปรที่สองสร้างรายการก้าวย่างด้วยโหมดปัจจุบัน

#!/bin/bash

ก=()
ขณะอ่าน -r; ทำ
    [[ $ตอบกลับ \
    =~ \ +([0-9]+)x([0-9]+)\ +[0-9.]+\* ]] && a+=(${BASH_REMATCH[@]:1:2})
เสร็จสิ้น < <(xrandr --current)

#พิมพ์ปณิธานครั้งแรก
อ่าน x y <<< ${a[@]::2} && echo ${x}x${y}

โพสต์คำตอบ

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