私はあなたが何を求めているのかよくわかりません。「ポート」に何度か言及しますが、例では、答えは/dev/ttyUSB0
であり、これはポートではなくデバイス開発パスです。したがって、この答えは、各デバイスの開発パスを見つけることです。
以下は、属性を/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
。これは、サブシェルを使用し、各ループで変数が消去されるように、括弧でコードをラップする理由でもあります。
[[ -z "$ID_SERIAL" ]] && continue
実際のデバイスではないもののより多くのフィルタリング。
echo "/dev/$devname - $ID_SERIAL"
この行が何をするのか知っていることを願っています:-)
/dev
をのエントリに関連付けlsusb
ますか?または/dev
、物理USBデバイスから派生したすべてのデバイスを一覧表示しますか?それとも、ただ欲しいls /dev/ttyUSB*
ですか?