当您输入cd /sys/class/drm
然后使用时:
$ ll */status
-rw-r--r-- 1 root root 4096 Dec 23 08:43 card1-DP-1/status
-rw-r--r-- 1 root root 4096 Dec 25 15:22 card1-DP-2/status
-rw-r--r-- 1 root root 4096 Dec 25 15:22 card1-eDP-1/status
-rw-r--r-- 1 root root 4096 Dec 25 15:22 card1-HDMI-A-1/status
-rw-r--r-- 1 root root 4096 Dec 25 15:22 card1-HDMI-A-2/status
其次是:
$ cat */status
connected
disconnected
connected
disconnected
disconnected
您将获得一些有关xrandr
监视器的有用信息,以及哪些名称已连接,哪些名称未连接。 就我而言,我必须“连接点”才能知道:
card1-DP-1/status
=connected
card1-eDP-1/status
=connected
为了避免连接点,有没有办法将虚拟文件系统文件名与其内容匹配?
答案1
我想到的第一件事是:
$ cd /sys/class/drm
$ grep . */status
card0-DVI-I-1/status:disconnected
card0-DVI-I-2/status:connected
$
请注意,如果只有一个接口,grep 将不会列出文件名:
$ grep . */status
connected
$
但如果您只有一个,您大概就不会对哪个是这个意思感到困惑。如果需要,请使用 -H 标志:
$ grep -H . */status
card0-VGA-1/status:connected
$
在不使用 -H 标志之前,我们的做法是
$ grep . */status /dev/null
card0-VGA-1/status:connected
$
答案2
在我的~/.bashrc
终端启动文件(设置了 shell 提示符的地方)中我定义了这个函数:
dircat ()
{
if [[ $# -eq 0 ]]; then
echo Directory tree required, eg. 'dircat /sys/class/drm/*/status'.;
else
paste <(ls "$@") <(cat "$@") | column -s ' ' -t;
fi
}
使用有问题的同一目录使用以下命令:
$ cd /sys/calss/drm
/sys/calss/drm$ dircat */status
card1-DP-1/status connected
card1-DP-2/status disconnected
card1-eDP-1/status connected
card1-HDMI-A-1/status disconnected
card1-HDMI-A-2/status disconnected
以下是使用该dircat
函数的另一个示例:
$ dircat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq 800044
/sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq 800023
/sys/devices/system/cpu/cpu2/cpufreq/scaling_cur_freq 800043
/sys/devices/system/cpu/cpu3/cpufreq/scaling_cur_freq 800107
/sys/devices/system/cpu/cpu4/cpufreq/scaling_cur_freq 800030
/sys/devices/system/cpu/cpu5/cpufreq/scaling_cur_freq 800047
/sys/devices/system/cpu/cpu6/cpufreq/scaling_cur_freq 800079
/sys/devices/system/cpu/cpu7/cpufreq/scaling_cur_freq 800106
最后再举一个例子:
$ cd /sys/bus/usb/devices/
/sys/bus/usb/devices$ dircat usb*/power/wakeup
usb1/power/wakeup disabled
usb2/power/wakeup disabled
usb3/power/wakeup disabled
usb4/power/wakeup disabled
答案3
我知道您bash
大部分时间都在使用脚本解决方案,因此为什么不利用的bash
功能,特别是关联数组:
$ cd /sys/class/drm
$ declare -A monitor_status
$ for i in * ; do [ -f "$i"/status ] && monitor_status["$i"]=$(cat "$i"/status ) ; done
在这里我们将所有内容加载到关联数组中monitor_status
,其中监视器的名称是键。稍后可以通过以下方式轻松访问数组中的键,${!array_name[@]}
并且可以使用相应的键来访问数组本身中的每个项目:
# Note I'm using virtual machine, so only one monitor here
$ for monitor in "${!monitor_status[@]}" ; do printf "%s:%s\n" "$monitor" "${monitor_status[$monitor]}"; done
card0-VGA-1:connected
这样做的好处是
我们有一个单一的数据结构来保存两个相关的信息,并且它可以进一步用作脚本中的变量。
无需额外的解析或复杂的功能
本机 bash 工具(除了 之外
cat
,尽管可以用 替代$(< "$i"/status )
)。简短而清晰
也可以看看BASH 关联数组打印