1. 검증

1. 검증

자동 재설정을 원하는 USB 장치가 있습니다. 현재는 두 개의 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 명령을 한 줄 명령으로 실행하고 싶습니다. 제안 사항이 있습니까?

나의 시도와 목표:

lsusb | grep "Tascam" | awk '{printf "/usr/bin/usbreset %d", $6}'
[user1@gs10 devt]$ sudo /usr/bin/usbreset 1d6b:0003

답변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”. 필드 6 hex:hex인쇄 기능명령문은 첫 번째 숫자가 있으면 첫 번째 숫자만 인쇄하고, 그렇지 않으면 0을 인쇄합니다.
  • 12a1:06df->12
  • a112:3619->0

답변2

이것이 당신이하고 싶은 일인 것 같습니다 :

$ cat file | awk '$7=="Tascam"{print $6}' | xargs echo sudo /usr/bin/usbreset
sudo /usr/bin/usbreset 1604:10c0

또는:

$ echo sudo /usr/bin/usbreset "$(cat file | awk '$7=="Tascam"{print $6}')"
sudo /usr/bin/usbreset 1604:10c0

출력에 만족하고 현재 에코된 명령을 실제로 실행하려면 다음 cat file으로 바꾸고 lsusb삭제하세요.echo

관련 정보