自動リセットしたいUSBデバイスがあります。現在、2つのUSBデバイスがありますが、時々より多くの可能性があります。
[user1@gs10 devt]$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 007: ID 1604:10c0 Tascam Dell Integrated Hub
指示:
- 定期的に機器番号が変更されます。 (ファームウェアの問題(本人側))
- 他のTascamハブに接続する場合、IDは動的です。
- 文字列はスペースとダッシュに変更することもできます。
リセットするデバイスはデバイス007です。デバイスIDを識別する方法は次のとおりです。
[user1@gs10 devt]$ lsusb | grep "Tascam" | awk '{printf $6 "\n"}'
1d6b:0003
うまくいきます。ベンダーIDを手動で入力せずに、カーネルのusbresetコマンドを1行のコマンドで実行したいと思います。提案はありますか?
私の試みと目標:
lsusb | grep "Tascam" | awk '{printf "/usr/bin/usbreset %d", $6}'
[user1@gs10 devt]$ sudo /usr/bin/usbreset 1d6b:0003
ベストアンサー1
1つのオプションはsystem()
内部で直接使用することですawk
。
1.検証
以下で端末をリクエストして確認してくださいlsusb
。
lsusb | awk '/Tascam.*Hub$/{ system("lsusb -d " $6) }'
その後、一致から行全体を取得しますvendor:product
(フィールド6)。
Tascam<Anything zero or more times>Hub<END-OF-LINE>
そして、以下を実行します。lsusb -d vendor:product
これは次の日に実行されます。みんなTascamホイールと一致。
2.実際の通貨
実際に電話usbreset
:
lsusb | sudo awk '/Tascam.*Hub$/{ system("/usr/bin/usbreset " $6) }'
あるいは、エラーが発生した場合は終了する方が良いかもしれません。
lsusb | sudo awk '/Tascam.*Hub/{ if (system("/usr/bin/usbreset " $6)) exit 1 }'
〜のようにsystem(expression)
コマンドの終了ステータスを返します。0
成功したら、それを使用してステータスがif ()
<> 0であることを確認して続行できますexit 1
。他のもので終了し、0
エラー信号を送信します。
!= 0
読みやすくなると思われる場合は、それを使用することを選択できます。たぶんエラーが発生する可能性があります。
lsusb | sudo awk '
/Tascam.*Hub/ {
if (system("/usr/bin/usbreset " $6) != 0) {
print "usbreset failed" >"/dev/stderr"
exit 1
}
}'
3. 機器内ラッパー+フィルタ
欲しいならフィルターデバイス番号によっては、それをシェルスクリプトにラップして(おそらくそれを行う)、次のことを行う方が良いかもしれません。
#! /bin/sh -
# Check argument is given
if [ -z "$1" ]; then
printf 'Missing device number\n' >&2
exit 1
fi
# Check sudo or abort
sudo echo >/dev/null || exit 1
lsusb |
sudo awk -v dev="$1" '
BEGIN {
dev = sprintf("%03d:", dev)
eno = 1
}
$4 == dev && /Tascam.*Hub/ {
if (system("/usr/bin/usbreset " $6) != 0) {
eno = 2
} else {
eno = 0
}
# Exit on first match of device-number + name
exit
}
END {
if (eno == 0)
print "OK"
else if (eno == 1)
print "No device found" >"/dev/stderr"
else if (eno == 2)
print "usbreset failed" >"/dev/stderr"
exit eno
}'
ガイドラインusbreset
ローカルにインストールする方法はありませんが、一部の人はパラメータを次のように扱うようです。
/dev/bus/usb/<bus>/<device-number>
この場合、次のようなものを使用できます。
# Testing:
system(sprintf("ls -l /dev/bus/usb/%03d/%03d", $2, $4))
# Testing:
system(sprintf("/usr/bin/usbreset /dev/bus/usb/%03d/%03d", $2, $4))
4. 関連問題に関する注意事項:
grep
awk
次のステップが不要なステップはいつですか?awk
正規表現と一致します。この場合、コード内の単純な文字列です。
awk '/^foo/{ this line starts with foo }'
など。
printf $6 "\n"
印刷+梱包をご希望のようです$6
。それは次のとおりです。
print $6
printf "%s\n", $6
$6
また、awkにフォーマット文字列として使用するように指示します。これは悪くなる可能性があり、一般的に良いことではありません。$6
たとえば、そうであれば、foo%dbar
awkは数値を引数として期待します。など。
printf "/usr/bin/usbreset %d", $6
、説明する「番号印刷」ここの値は「$6」。フィールドhex:hex
6印刷機能ステートメントは、最初の数字がある場合は最初の数字のみを印刷し、それ以外の場合は0を印刷します。
12a1:06df
->12
a112:3619
->0