ฉันไม่แน่ใจในสิ่งที่คุณถาม คุณพูดถึง 'พอร์ต' หลายครั้ง แต่ในตัวอย่างของคุณคุณบอกว่าคำตอบคือ/dev/ttyUSB0
ซึ่งเป็นเส้นทางอุปกรณ์ dev ไม่ใช่พอร์ต ดังนั้นคำตอบนี้เกี่ยวกับการค้นหาเส้นทาง dev สำหรับแต่ละอุปกรณ์
ด้านล่างนี้เป็นสคริปต์ที่รวดเร็วและสกปรกซึ่งจะตรวจสอบอุปกรณ์ต่างๆ/sys
เพื่อค้นหาอุปกรณ์ USB ที่มีID_SERIAL
คุณสมบัติ โดยทั่วไปแล้วอุปกรณ์ USB จริงเท่านั้นที่จะมีคุณสมบัตินี้และเราสามารถกรองได้ หากเราไม่ทำเช่นนั้นคุณจะเห็นหลายสิ่งหลายอย่างในรายการที่ไม่ใช่อุปกรณ์ทางกายภาพ
#!/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
ในระบบของฉันผลลัพธ์นี้มีดังต่อไปนี้:
/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
คำอธิบาย:
find /sys/bus/usb/devices/usb*/ -name dev
อุปกรณ์ที่ปรากฏขึ้น/dev
มีdev
ไฟล์ใน/sys
ไดเรกทอรีของพวกเขา ดังนั้นเราจึงค้นหาไดเรกทอรีที่ตรงกับเกณฑ์นี้
syspath="${sysdevpath%/dev}"
/dev
เราต้องการเส้นทางไดเรกทอรีดังนั้นเราจึงเปลื้องผ้า
devname="$(udevadm info -q name -p $syspath)"
สิ่งนี้ทำให้เรามีเส้นทาง/dev
ที่สอดคล้องกับ/sys
อุปกรณ์นี้
[[ "$devname" == "bus/"* ]] && continue
สิ่งนี้จะกรองสิ่งที่ไม่ใช่อุปกรณ์จริง ไม่เช่นนั้นคุณจะได้สิ่งต่าง ๆ เช่นตัวควบคุม USB และฮับ
eval "$(udevadm info -q property --export -p $syspath)"
udevadm info -q property --export
รายการคำสั่งทั้งหมดคุณสมบัติของอุปกรณ์ในรูปแบบที่สามารถแยกวิเคราะห์โดยเปลือกลงในตัวแปร ดังนั้นเราจึงเรียกeval
สิ่งนี้ว่า นี่คือเหตุผลที่เราใส่โค้ดไว้ในวงเล็บเพื่อที่เราจะใช้ subshell และตัวแปรจะถูกลบในแต่ละลูป
[[ -z "$ID_SERIAL" ]] && continue
กรองสิ่งต่าง ๆ ที่ไม่ใช่อุปกรณ์จริง
echo "/dev/$devname - $ID_SERIAL"
ฉันหวังว่าคุณจะรู้ว่าบรรทัดนี้ทำอะไร :-)
/dev
กับรายการlsusb
หรือไม่? หรือคุณต้องการแสดงรายการอุปกรณ์ทั้งหมด/dev
ที่ได้มาจากอุปกรณ์ USB จริงหรือไม่? หรือคุณแค่ต้องการls /dev/ttyUSB*
?