Tôi không chắc chắn những gì bạn đang hỏi. Bạn đề cập đến 'cổng' nhiều lần, nhưng trong ví dụ của bạn, bạn nói câu trả lời là /dev/ttyUSB0
, đó là đường dẫn thiết bị, không phải cổng. Vì vậy, câu trả lời này là về việc tìm đường dẫn dev cho mỗi thiết bị.
Dưới đây là một tập lệnh nhanh và bẩn đi qua các thiết bị để /sys
tìm kiếm các thiết bị USB có ID_SERIAL
thuộc tính. Thông thường chỉ có các thiết bị USB thực sự sẽ có thuộc tính này và vì vậy chúng tôi có thể lọc với nó. Nếu chúng tôi không, bạn sẽ thấy rất nhiều thứ trong danh sách không phải là thiết bị vật lý.
#!/bin/bash
for sysdevpath in $(find /sys/bus/usb/devices/usb*/ -name dev); do
(
syspath="${sysdevpath%/dev}"
devname="$(udevadm info -q name -p $syspath)"
[[ "$devname" == "bus/"* ]] && continue
eval "$(udevadm info -q property --export -p $syspath)"
[[ -z "$ID_SERIAL" ]] && continue
echo "/dev/$devname - $ID_SERIAL"
)
done
Trên hệ thống của tôi, kết quả này như sau:
/dev/ttyACM0 - LG_Electronics_Inc._LGE_Android_Phone_VS930_4G-991c470
/dev/sdb - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/sdb1 - Lexar_USB_Flash_Drive_AA26MYU15PJ5QFCL-0:0
/dev/input/event5 - Logitech_USB_Receiver
/dev/input/mouse1 - Logitech_USB_Receiver
/dev/input/event2 - Razer_Razer_Diamondback_3G
/dev/input/mouse0 - Razer_Razer_Diamondback_3G
/dev/input/event3 - Logitech_HID_compliant_keyboard
/dev/input/event4 - Logitech_HID_compliant_keyboard
Giải trình:
find /sys/bus/usb/devices/usb*/ -name dev
Các thiết bị hiển thị trong /dev
có một dev
tập tin trong /sys
thư mục của họ . Vì vậy, chúng tôi tìm kiếm các thư mục phù hợp với tiêu chí này.
syspath="${sysdevpath%/dev}"
Chúng tôi muốn đường dẫn thư mục, vì vậy chúng tôi loại bỏ /dev
.
devname="$(udevadm info -q name -p $syspath)"
Điều này cho chúng ta đường dẫn /dev
tương ứng với /sys
thiết bị này .
[[ "$devname" == "bus/"* ]] && continue
Điều này lọc ra những thứ không phải là thiết bị thực tế. Nếu không, bạn sẽ nhận được những thứ như bộ điều khiển & trung tâm USB.
eval "$(udevadm info -q property --export -p $syspath)"
Các udevadm info -q property --export
danh sách lệnh tất cả các thuộc tính thiết bị trong một định dạng mà có thể được phân tích bằng vỏ vào các biến. Vì vậy, chúng tôi chỉ đơn giản là kêu gọi eval
này. Đây cũng là lý do tại sao chúng tôi bọc mã trong ngoặc đơn, để chúng tôi sử dụng một lớp con và các biến được xóa trên mỗi vòng lặp.
[[ -z "$ID_SERIAL" ]] && continue
Lọc nhiều thứ không phải là thiết bị thực tế.
echo "/dev/$devname - $ID_SERIAL"
Tôi hy vọng bạn biết những gì dòng này làm :-)
/dev
với một mục tronglsusb
? Hoặc bạn có muốn liệt kê tất cả các thiết bị/dev
có nguồn gốc từ một thiết bị USB vật lý không? Hay bạn chỉ muốnls /dev/ttyUSB*
?