Puncte:0

Cum se schimbă codul bash pentru a obține încă rezoluția ecranului pe ubuntu de către xrandr, dar fără a utiliza awk?

drapel ng

Următorul cod bash funcționează bine pentru a obține și a economisi rezoluția x any y a unui ecran, nevăzând xrandr:

Puteți obține rezoluția actuală a ecranului, după cum urmează:

Obțineți rezoluția X rulând:

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

Obțineți rezoluția Y rulând:

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

Ieșiți rezoluția X și Y rulând:

ecou "$X"x"$Y"

sau

ecou „$X”
ecou „$Y”

Cum se schimbă acest cod pentru a obține rezoluția ecranului pe ubuntu, încă nevăzând xrandr, fără a utiliza awk?

drapel hr
IMHO ar fi mai logic să rămâi awk și să pierzi celelalte comenzi, ex. `awk '/\*/{split($1,a,"x"); imprima a[2]; ieșire}'`
Eddy763 avatar
drapel ng
awk nu este disponibil pe toate sistemele...
muru avatar
drapel us
Pe ce sisteme Ubuntu nu este disponibil? Chiar și `ubuntu-minimal` depinde de asta. Imaginile standard Ubuntu Docker, care sunt, de asemenea, destul de minime, o au.
Puncte:4
drapel cn

În primul rând, chiar nu există niciun motiv pentru a elimina awk. Este extrem de rapid, stabil și făcut pentru acest gen de lucruri. Cu toate acestea, comanda ta este complicată inutil. Ai putea face pur și simplu:

$ xrandr --current | awk '$2~/\*/{printează $1}' 
2560x1440

Dacă într-adevăr aveți nevoie de x și y separat, faceți:

x=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f1)
y=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f2)
ecou „$x”
ecou „$y”

Sau, mai simplu:

$ citește x y < <(xrandr --current | awk '$2~/\*/{sub(/x/," ");printează $1,$2}')
$ echo "x:$x y:$y"
x:2560 y:1440

Și dacă insistați să nu folosiți awk, iată câteva alte opțiuni:

citește x y < <(xrandr --current | sed -En '/\*/{s/^ *([0-9]+)x([0-9]+).*/\1 \2/p} ')
ecou „$x”
ecou „$y”

sau

citește x y < <(xrandr --current | perl -lne 'printează "$1 $2" dacă /^ *([0-9]+)x([0-9]+).*/')
ecou „$x”
ecou „$y”

sau

citește x y < <(xrandr --current | grep -oP '\d+x\d+' | tr x ' ')
ecou „$x”
ecou „$y”

Rețineți că toate acestea presupun că un singur ecran este conectat, la fel ca abordarea dumneavoastră originală.

terdon avatar
drapel cn
@Eddy763 nu vă faceți griji pentru asta :) Cu toate acestea, dacă unul dintre răspunsurile de aici v-a rezolvat problema, vă rugăm să luați un moment și [acceptați-l](//askubuntu.com/help/someone-answers) făcând clic pe bifa de pe stanga. Acesta este cel mai bun mod de a vă exprima mulțumirile pe site-urile Stack Exchange.
drapel hr
O altă opțiune bazată pe `citire` ar putea fi ceva de genul `IFS=' x' read x y _
terdon avatar
drapel cn
@Eddy763 grozav! Am presupus că asta era implicit și nu am vrut să o repet pentru fiecare soluție.
Puncte:2
drapel cn

Puteți utiliza un operator binar și citit:

[[ $(xrandr --current) \
    =~ curent\ ([0-9]+)\ x\ ([0-9]+) \
]] && citește x y <<< „${BASH_REMATCH[@]:1:2}”

eco ${x}x${y}

A doua variantă creează o listă de pas cu modurile curente.

#!/bin/bash

a=()
în timp ce se citește -r; do
    [[ $REPLY \
    =~ \ +([0-9]+)x([0-9]+)\ +[0-9.]+\* ]] && a+=(${BASH_REMATCH[@]:1:2})
terminat < <(xrandr --current)

# imprimați prima rezoluție.
citește x y <<< ${a[@]::2} && echo ${x}x${y}

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.