Проблемы Grub (но на самом деле это больше, чем просто)

На самом деле нет хорошего способа сопоставления символьных устройств, таких как /dev/ttyUSB0, с соответствующими USB-устройствами и номерами шин. НО, возможно!

Возможно, что-то вроде этого:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

Оттуда вы получите кучу информации об устройстве и его родительские устройства. Теперь все дело в разборе этих данных, чтобы получить то, что вы хотите. Я использовал это в прошлом:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

Теперь, если это не глоток, я не знаю, что это такое! Давайте это сломаем:

НО, возможно! - возвращает информацию об устройстве и его родительских устройствах

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' - анализирует эти данные и возвращает любые строки, содержащие атрибут «devnum» или «busnum». Мы предположим, что «busnum» указан первым ... и в этом случае ... мы можем просто захватить первые две строки вывода.

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' - Возьмите первые 2 строки вывода. Мы могли бы получить больше фантазии здесь, но мы просто делаем предположение, что первые «busnum» и «devnum» самого близкого родителя будут перечислены первыми.

awk '{$1 = sprintf("%03d", $1); print}' - принимает эти цифры и набивает их нули.

awk '{$1 = sprintf("%03d", $1); print}' - весь этот джаз завернут в оператор echo, чтобы заменить символы новой строки пробелами. Вы можете добавить -n в echo, если хотите отрезать конечную новую строку.

tr " " "/" - заменить пробелы на выходе с помощью косой черты

Это будет выведите что-то вроде:

/dev/bus/usb/001/011

... которое, конечно же, является устройством. Если вы хотите, вы можете легко вывести что-то вроде busnum:001 devnum:011 с помощью нескольких настроек:

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`
1
задан 21 July 2013 в 21:14

0 ответов

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

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