1.検証

1.検証

自動リセットしたい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. 関連問題に関する注意事項:

  1. grepawk次のステップが不要なステップはいつですか?awk正規表現と一致します。この場合、コード内の単純な文字列です。

awk '/^foo/{ this line starts with foo }'など。

  1. printf $6 "\n"

印刷+梱包をご希望のようです$6。それは次のとおりです。

print $6
printf "%s\n", $6

$6また、awkにフォーマット文字列として使用するように指示します。これは悪くなる可能性があり、一般的に良いことではありません。$6たとえば、そうであれば、foo%dbarawkは数値を引数として期待します。など。

  1. printf "/usr/bin/usbreset %d", $6、説明する「番号印刷」ここの値は「$6」。フィールドhex:hex6印刷機能ステートメントは、最初の数字がある場合は最初の数字のみを印刷し、それ以外の場合は0を印刷します。
  • 12a1:06df->12
  • a112:3619->0

おすすめ記事