Когда Вы вводите 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
Для предотвращения необходимости соединить точки, там способ совпадения имен файлов виртуальной файловой системы к их содержанию?
Вот первая вещь, которая пришла на ум:
$ 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
$
В моем ~/.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
Я знаю, что Вы используете 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
Преимущество здесь - это
у нас есть одна единственная структура данных для содержания двух связанных сведений, и она может далее использоваться в качестве переменных в сценарии.
никакая потребность в дополнительном парсинге или комплексных функциях
Собственные инструменты удара (кроме cat
, хотя с этим можно заменить просто $(< "$i"/status )
).
короткий и ясный
См. также печать ассоциативного массива Bash