情况:我正在使用多个监视器,我想在 bash 中获取它们的名称。目前我正在使用 Ubuntu 10.04。
我知道xrandr。从中我只能得到统计数据。我想要的是读取数组中的所有监视器名称以使用它们。
有没有一种明确的方法可以做到这一点,而无需从某种字符串中删除名称?一个明确的方法是从文件中读取它们。一种不清楚的方法是将 xrandr 输出通过管道传输到某种函数以从中删除名称。
原文由 Jānis Gruzis 发布,翻译遵循 CC BY-SA 4.0 许可协议
情况:我正在使用多个监视器,我想在 bash 中获取它们的名称。目前我正在使用 Ubuntu 10.04。
我知道xrandr。从中我只能得到统计数据。我想要的是读取数组中的所有监视器名称以使用它们。
有没有一种明确的方法可以做到这一点,而无需从某种字符串中删除名称?一个明确的方法是从文件中读取它们。一种不清楚的方法是将 xrandr 输出通过管道传输到某种函数以从中删除名称。
原文由 Jānis Gruzis 发布,翻译遵循 CC BY-SA 4.0 许可协议
受贝尼回答的启发,这将使用 xrandr
读取 EDID 数据,并根据 EDID 规范 提取监视器名称,不需要任何外部工具,例如 parse-edid
:
#!/bin/bash
while read -r output hex conn; do
[[ -z "$conn" ]] && conn=${output%%-*}
echo "# $output $conn $(xxd -r -p <<< "$hex")"
done < <(xrandr --prop | awk '
!/^[ \t]/ {
if (output && hex) print output, hex, conn
output=$1
hex=""
}
/ConnectorType:/ {conn=$2}
/[:.]/ && h {
sub(/.*000000fc00/, "", hex)
hex = substr(hex, 0, 26) "0a"
sub(/0a.*/, "", hex)
h=0
}
h {sub(/[ \t]+/, ""); hex = hex $0}
/EDID.*:/ {h=1}
END {if (output && hex) print output, hex, conn}
' | sort
)
Uses awk
to precisely extract the monitor name only , and no extra garbage from the EDID, hence “magic numbers” like 000000fc00
, 26
and 0a
.最后使用 xxd
将十六进制转换为 ASCII,每行打印一个监视器名称。
基于这个解决方案,我制作了一个 方便的脚本来切换监视器,它也可以用来简单地列出监视器信息:
$ monitor-switch --list
Connected monitors:
# DFP5 HDMI HT-R391
# DFP7 DVI-I DELL U2412M
$ monitor-switch --list
Connected monitors:
# DisplayPort-1 DisplayPort DELL U2412M
# DisplayPort-3 DisplayPort DELL U2415
# HDMI-A-2 HDMI LG TV
原文由 MestreLion 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答798 阅读✓ 已解决
2 回答3.2k 阅读
sudo get-edid
对我不起作用。 (编辑:现在可以在另一台计算机上运行,Lubuntu 14.10;我会责怪 BIOS 差异,但这是随机猜测……)无论如何,在 X 下,
xrandr --verbose
打印 EDID 块。这是一种快速而肮脏的方法来提取它并传递给parse-edid
: