现状:我使用多台显示器,我想在bash他们的名字。 目前我使用的Ubuntu 10.04。
我知道xrandr。 从中我能办到的统计数据。 我要的是一个数组与他们一起阅读所有监测的名字。
是否有一个明确的方式来做到这一点,而不从某种字符串的切割名字? 一个明显的方法就是从文件中读取它们。 一个不明确的方法是将管xrandr输出某种切出从它的名字的功能。
现状:我使用多台显示器,我想在bash他们的名字。 目前我使用的Ubuntu 10.04。
我知道xrandr。 从中我能办到的统计数据。 我要的是一个数组与他们一起阅读所有监测的名字。
是否有一个明确的方式来做到这一点,而不从某种字符串的切割名字? 一个明显的方法就是从文件中读取它们。 一个不明确的方法是将管xrandr输出某种切出从它的名字的功能。
sudo get-edid
并没有为我工作。 (编辑:现在可以在另一台计算机上,Lubuntu 14.10;我会责怪BIOS的差异,但这是一个随机猜测...)
反正在X, xrandr --verbose
打印EDID块。 这里是一个快速和肮脏的方法来提取它,并传给parse-edid
:
#!/bin/bash
xrandr --verbose | perl -ne '
if ((/EDID(_DATA)?:/.../:/) && !/:/) {
s/^\s+//;
chomp;
$hex .= $_;
} elsif ($hex) {
# Use "|strings" if you dont have read-edid package installed
# and just want to see (or grep) the human-readable parts.
open FH, "|parse-edid";
print FH pack("H*", $hex);
$hex = "";
}'
通过贝尼的回答启发,这将读取EDID使用数据xrandr
并根据提取的监控名EDID规范 ,不需要像任何外部工具parse-edid
:
#!/bin/sh
xrandr --verbose | awk '
/[:.]/ && hex {
sub(/.*000000fc00/, "", hex)
hex = substr(hex, 0, 26) "0a"
sub(/0a.*/, "0a", hex)
print hex
hex=""
}
hex {
gsub(/[ \t]+/, "")
hex = hex $0
}
/EDID.*:/ {
hex=" "
}' | xxd -r -p
使用awk
精确地提取只监控器名称,并从EDID没有多余的垃圾,因此“幻数”像000000fc00
, 26
和0a
。 最后使用xxd
从十六进制转换为ASCII码,打印每行一个监视器名称。
在此基础上的解决方案我做了一个方便的脚本来切换显示器 ,也可用于简单的列表监测信息:
$ monitor-switch --list
Connected monitors:
# DFP5 HDMI HT-R391
# DFP7 DVI-I DELL U2412M
经测试在Ubuntu 16.04,18.04。 (我知道它来不及回答,但今天这个解决方案是相关的)
$ sudo apt-get install -y hwinfo
...
$ hwinfo --monitor --short
monitor:
SONY TV
AUO LCD Monitor
我有连接两台显示器。 一与笔记本电脑,而另一个是外部显示。 一旦外部显示器插入式或缩小,这个命令体现了变化。 你需要不断进行轮询。 卸下--short
选项给出了更详细的信息。
您可以查询与下面的后台作业的状态:
$ while true;
> do
> hwinfo --monitor --short;
> sleep 2;
> done >> monitor.log &
的while true
循环运行无限次。 的sleep 2
暂停环路2秒的每次迭代。 和输出hwinfo --monitor --short
追加到monitor.log
。 此日志文件可以给你监控插件和外挂出的活动历史。
供参考:我使用的是后台进程(daemon)python脚本使用上面的命令(以及其他类似的),以检测是否有人做一些硬件插件和插件奏与计算机实验室的系统。 如果是这样,我得到相应的通知,有人插上电源输出/输入显示器,鼠标或键盘几乎实时的!
有关更多信息hwinfo
命令是在这里 。 它的手册页也是一个很好的来源。
如果你不想来解析xrandr
输出,编写使用一个C程序libXrandr
你只想要什么得到。 如果你想要做的是查询信息,也可以很快完成。 阅读本文件 。
如果你想获得真正的监视器名称改为@ dtmilano的解决方案还有一个办法是让使用libXrandr显示器的EDID属性,然后手动分析它,并打印(读取EDID规范)。
xrandr
源代码 。
我知道这是一个肮脏的方式,但它给了我,甚至比出色一些的显示器型号名称sudo get-edid|parse-edid
。 它读取阵列的信息,并输出它可以读取像你这样读取文件的方式。 您可以根据自己的需要修改它。
#!/bin/bash
#
#
# get-monitors.sh
#
# Get monitor name and some other properties of connected monitors
# by investigating the output of xrandr command and EDID data
# provided by it.
#
# Copyright (C) 2015,2016 Jarno Suni <8@iki.fi>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. See <http://www.gnu.org/licenses/gpl.html>
set -o nounset
set -o errexit
# EDID format:
# http://en.wikipedia.org/wiki/Extended_Display_Identification_Data#EDID_1.3_data_format
# http://read.pudn.com/downloads110/ebook/456020/E-EDID%20Standard.pdf
declare -r us=';' # separator string;
# If EDID has more than one field with same tag, concatenate them,
# but add this string in between.
declare -r fs=$'\x1f' # Field separator for internal use;
# must be a character that does not occur in data fields.
declare -r invalid_edid_tag='--bad EDID--'
# If base EDID is invalid, don't try to extract information from it,
# but assign this string to the fields.
# Get information in these arrays:
declare -a outs # Output names
declare -a conns # Connection type names (if available)
declare -a names # Monitor names (but empty for some laptop displays)
declare -a datas # Extra data; may include laptop display brand name
# and model name
declare -i no # number of connected outputs (to be counted)
# xrandr command to use as a source of information:
declare -r xrandr_output_cmd="xrandr --prop"
hex_to_ascii() {
echo -n "$1" | xxd -r -p
}
ascii_to_hex() {
echo -n "$1" | xxd -p
}
get_info() {
no=0
declare OIFS=$IFS;
IFS=$fs
while read -r output conn hexn hexd; do
outs[no]="${output}"
conns[no]="${conn}"
names[no]="$(hex_to_ascii "$hexn")"
datas[no]="$(hex_to_ascii "$hexd")"
(( ++no ))
done < <(eval $xrandr_output_cmd | gawk -v gfs="$fs" '
function print_fields() {
print output, conn, hexn, hexd
conn=""; hexn=""; hexd=""
}
function append_hex_field(src_hex,position,app_hex, n) {
n=substr(src_hex,position+10,26)
sub(/0a.*/, "", n)
# EDID specification says field ends by 0x0a
# (\n), if it is shorter than 13 bytes.
#sub(/(20)+$/, "", n)
# strip whitespace at the end of ascii string
if (n && app_hex) return app_hex sp n
else return app_hex n
}
function get_hex_edid( hex) {
getline
while (/^[ \t]*[[:xdigit:]]+$/) {
sub(/[ \t]*/, "")
hex = hex $0
getline
}
return hex
}
function valid_edid(hex, a, sum) {
if (length(hex)<256) return 0
for ( a=1; a<=256; a+=2 ) {
# this requires gawk
sum+=strtonum("0x" substr(hex,a,2))
# this requires --non-decimal-data for gawk:
#sum+=sprintf("%d", "0x" substr(hex,a,2))
}
if (sum % 256) return 0
return 1
}
BEGIN {
OFS=gfs
}
/[^[:blank:]]+ connected/ {
if (unprinted) print_fields()
unprinted=1
output=$1
}
/[^[:blank:]]+ disconnected/ {
if (unprinted) print_fields()
unprinted=0
}
/^[[:blank:]]*EDID.*:/ {
hex=get_hex_edid()
if (valid_edid(hex)) {
for ( c=109; c<=217; c+=36 ) {
switch (substr(hex,c,10)) {
case "000000fc00" :
hexn=append_hex_field(hex,c,hexn)
break
case "000000fe00" :
hexd=append_hex_field(hex,c,hexd)
break
}
}
} else {
# set special value to denote invalid EDID
hexn=iet; hexd=iet
}
}
/ConnectorType:/ {
conn=$2
}
END {
if (unprinted) print_fields()
}' sp=$(ascii_to_hex $us) iet=$(ascii_to_hex $invalid_edid_tag))
IFS="$OIFS"
}
get_info
# print the colums of each display quoted in one row
for (( i=0; i<$no; i++ )); do
echo "'${outs[i]}' '${conns[i]}' '${names[i]}' '${datas[i]}'"
done
您可以尝试ddcprobe
和/或get-edid
$ sudo apt-get install xresprobe read-edid
$ sudo ddcprobe
$ sudo get-edid
你要找的EDID信息,它是沿着I²C总线传递,并通过您的视频驱动程序解释。 作为dtmilano说,获得编辑从ddcprobe应该工作。
您也可以通过登录你的X启动这样的信息:
startx -- -logverbose 6
几年前,我用了一个叫包读取EDID来收集这些信息。
读-EDID包可在Ubuntu已经上市, 根据这个博客帖子从2009年。