자동 재설정을 원하는 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. 관련 문제에 대한 참고 사항:
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”. 필드 6hex: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