Как я могу перечислить имена виртуальной файловой системы и содержание рядом?

Когда Вы вводите 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

Для предотвращения необходимости соединить точки, там способ совпадения имен файлов виртуальной файловой системы к их содержанию?

2
задан 26 December 2018 в 01:51

3 ответа

Вот первая вещь, которая пришла на ум:

$ 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
ответ дан 2 December 2019 в 02:12

В моем ~/.bashrc терминальный файл запуска (где приглашение оболочки установлено) у меня есть эта функция, определяемая:

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
1
ответ дан 2 December 2019 в 02:12

Я знаю, что Вы используете 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. Собственные инструменты удара (кроме cat, хотя с этим можно заменить просто $(< "$i"/status ) ).

  4. короткий и ясный

См. также печать ассоциативного массива Bash

1
ответ дан 2 December 2019 в 02:12

Другие вопросы по тегам:

Похожие вопросы: