同じデバイス識別子を持つ複数のデバイスを持つlsusbに対してusbresetプログラムを実行しようとしています。
lsusbを実行してデバイスを一覧表示します。 grep [identifer]を追加して、その識別子を持つデバイスのみを一覧表示しました。
次に、awkコマンドを実行してusbresetプログラムに挿入されるバスとデバイス番号を取得する必要があります(https://github.com/jkulesza/usbreset)これにより、そのIDに一致するすべてのデバイスがリセットされます。
コマンドは次のとおりです。
lsusb | grep 1234:a1b1 | while read line ; do awk -F '[^0-9]+' '{ system("sudo ./usbreset /dev/bus/usb/002/"$3) }'; done
ここで-F '[^0-9]+'
helpは、デバイス番号の末尾にある「:」を削除し、$3
lsusbコマンド出力の4番目の列を選択するのに役立ちます。Bus 002 Device 010: ID 1234:a1b1
これはうまくいきますが、私が経験している問題は、このIDを持つデバイスが6つあり、awkコマンドが最初の結果を切り取り、5つだけを印刷することです。
user@localhost:~$ lsusb | grep 1234:a1b1
Bus 002 Device 015: ID 1234:a1b1
Bus 002 Device 014: ID 1234:a1b1
Bus 002 Device 013: ID 1234:a1b1
Bus 002 Device 010: ID 1234:a1b1
Bus 002 Device 009: ID 1234:a1b1
Bus 002 Device 008: ID 1234:a1b1
そして:
user@localhost:~$ lsusb | grep 1234:a1b1 | while read line ; do awk -F '[^0-9]+' '{ print $3 }'; done
014
013
010
009
008
私がどこで間違っているかを見つけるのに役立つどんな提案でもいいでしょう!
答え1
read line
AWK以外の呼び出しによって回線が消えます。私はこの問題に別の方法でアクセスします:
lsusb -d 1234:a1b1 | while read _ bus _ device _; do
sudo ./usbreset "/dev/bus/usb/${bus}/${device%:}"
done
これはlsusb
デバイスをフィルタリングする機能を使用し、バスとデバイス識別子を対応する変数に読み込み、適切な値を提供し、それに続く「:usbreset
」を削除します${device}
。
答え2
@StephenKittのシェルループは効率が問題にならず、入力形式がよく知られていて単純で、単にテキストを操作するものではないので、この場合に良いです(参照シェルループを使用してテキストを処理することが悪い習慣と見なされる理由)しかし、ループを書かない別のオプションは次のとおりです。
lsusb -d '1234:a1b1' |
awk -F'[ :]' '{printf "/dev/bus/usb/%s/%s\n", $2, $4}' |
xargs -n 1 sudo ./usbreset