ฉันไม่แน่ใจในสิ่งที่คุณถาม คุณพูดถึง 'พอร์ต' หลายครั้ง แต่ในตัวอย่างของคุณคุณบอกว่าคำตอบคือ/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*?