Điểm:0

Làm cách nào để thay đổi mã bash để giữ nguyên độ phân giải màn hình trên ubuntu bằng xrandr, nhưng không sử dụng awk?

lá cờ ng

Mã bash sau đang hoạt động tốt để lấy và lặp lại độ phân giải x an y của màn hình bằng cách ẩn xrandr:

Bạn có thể lấy độ phân giải màn hình hiện tại của mình như sau:

Nhận độ phân giải X bằng cách chạy:

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

Nhận độ phân giải Y bằng cách chạy:

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

Xuất độ phân giải X và Y bằng cách chạy:

tiếng vang "$X"x"$Y"

hoặc

lặp lại "$X"
lặp lại "$Y"

Làm cách nào để thay đổi mã này để có được độ phân giải màn hình trên Ubuntu, vẫn bằng cách không nhìn thấy xrandr, mà không cần sử dụng awk?

lá cờ hr
IMHO sẽ hợp lý hơn nếu giữ awk và mất các lệnh khác cũ. `awk '/\*/{split($1,a,"x"); in a[2]; thoát}'`
Eddy763 avatar
lá cờ ng
awk không có sẵn trên tất cả các hệ thống ...
muru avatar
lá cờ us
Nó không khả dụng trên hệ thống Ubuntu nào? Ngay cả `ubuntu-minimal` cũng phụ thuộc vào nó. Các hình ảnh Ubuntu Docker tiêu chuẩn, cũng khá tối thiểu, có nó.
Điểm:4
lá cờ cn

Trước hết, thực sự không có lý do gì để loại bỏ awk. Nó cực kỳ nhanh, ổn định và được tạo ra cho loại điều này. Tuy nhiên, lệnh của bạn phức tạp không cần thiết. Bạn chỉ có thể làm:

$ xrandr --hiện tại | awk '$2~/\*/{in $1}' 
2560x1440

Nếu bạn thực sự cần riêng x và y, hãy làm:

x=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f1)
y=$(xrandr --current | awk '$2~/\*/{print $1}' | cut -d'x' -f2)
lặp lại "$x"
lặp lại "$y"

Hoặc, đơn giản hơn:

$ read x y < <(xrandr --current | awk '$2~/\*/{sub(/x/," ");print $1,$2}')
$ tiếng vang "x:$x y:$y"
x:2560 y:1440

Và nếu bạn khăng khăng không sử dụng awk, đây là một số tùy chọn khác:

đọc x y < <(xrandr --current | sed -En '/\*/{s/^ *([0-9]+)x([0-9]+).*/\1 \2/p} ')
lặp lại "$x"
lặp lại "$y"

hoặc

đọc x y < <(xrandr --current | perl -lne 'print "$1 $2" if /^ *([0-9]+)x([0-9]+).*/')
lặp lại "$x"
lặp lại "$y"

hoặc

đọc x y < <(xrandr --current | grep -oP '\d+x\d+' | tr x ' ')
lặp lại "$x"
lặp lại "$y"

Lưu ý rằng tất cả những giả định này chỉ có một màn hình được kết nối, cũng như cách tiếp cận ban đầu của bạn.

terdon avatar
lá cờ cn
@Eddy763 đừng lo lắng về điều đó :) Tuy nhiên, nếu một trong những câu trả lời ở đây giải quyết được vấn đề của bạn, vui lòng dành chút thời gian và [chấp nhận nó](//askubuntu.com/help/someone-answers) bằng cách nhấp vào dấu kiểm trên Bên trái. Đó là cách tốt nhất để bày tỏ lời cảm ơn của bạn trên các trang Stack Exchange.
lá cờ hr
Một tùy chọn dựa trên `read` khác có thể giống như `IFS=' x' read x y _
terdon avatar
lá cờ cn
@Eddy763 thật tuyệt! Tôi cho rằng điều đó đã được ngụ ý và không muốn lặp lại nó trên mọi giải pháp.
Điểm:2
lá cờ cn

Bạn có thể sử dụng toán tử nhị phân và đọc:

[[ $(xrandr --current) \
    =~ hiện tại\ ([0-9]+)\ x\ ([0-9]+) \
]] && đọc x y <<< "${BASH_REMATCH[@]:1:2}"

tiếng vang ${x}x${y}

Biến thể thứ hai tạo danh sách sải chân với các chế độ hiện tại.

#!/bin/bash

a=()
trong khi đọc -r; làm
    [[ $REPLY \
    =~ \ +([0-9]+)x([0-9]+)\ +[0-9.]+\* ]] && a+=(${BASH_REMATCH[@]:1:2})
xong < <(xrandr --current)

# in độ phân giải đầu tiên.
đọc x y <<< ${a[@]::2} && echo ${x}x${y}

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.