如何并排列出虚拟文件系统名称和内容?

如何并排列出虚拟文件系统名称和内容?

当您输入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

这样做的好处是

  1. 我们有一个单一的数据结构来保存两个相关的信息,并且它可以进一步用作脚本中的变量。

  2. 无需额外的解析或复杂的功能

  3. 本机 bash 工具(除了 之外cat,尽管可以用 替代$(< "$i"/status ))。

  4. 简短而清晰

也可以看看BASH 关联数组打印

相关内容