변수를 사용하여 bash 스크립트 개발

변수를 사용하여 bash 스크립트 개발

재부팅할 때마다 연결된 스캐너의 USB 포트 할당이 올바르지 않습니다. 내 목표는 재부팅 시 실행되는 스크립트를 생성하여 상호 작용을 제거하는 것입니다.

포트 할당을 수동으로 수정하는 방법은 다음과 같습니다.

    1) lsusb -d 04f9:0272  #the output identifies the correct ports of the scanner       
    2) sudo chmod a+w /dev/bus/usb/001/002 #scanner now works

다음 스크립트는 변수를 생성하지만 "해당 파일 또는 디렉터리가 없습니다"라는 메시지와 함께 chmod가 실패합니다.

    buss=$(lsusb -d 04f9:0272 |awk '{print $2}')
    devis=$(lsusb -d 04f9:0272 |awk '{print $4}')
    sudo chmod a+w /dev/bus/usb/$buss/$devis

$buss 또는 $devis를 echo하면 올바른 값이 표시됩니다. 이 프로세스를 자동화하려면 더 많은 작업이 필요하다는 것을 알고 있습니다.

답변1

문제는 lsusb출력의 특정 형식일 수 있습니다.

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ print "/dev/bus/usb/" $2 "/" $4 }'
/dev/bus/usb/001/001:

끝에 추가 콜론을 기록해 두십시오. 다행히 awk나 쉘에서 쉽게 제거할 수 있습니다. 다음은 awk 예입니다.

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ a = $4; sub(/:$/, "", a); print "/dev/bus/usb/" $2 "/" a }'
/dev/bus/usb/001/001

답변2

lsusb출력에서 장치 번호 뒤에 콜론이 포함된다는 점을 제외하면 제대로 작동하는 것 같습니다 .

$ lsusb -d 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

따라서 devis변수에는 해당 내용이 포함되며 최종 결과는 /dev/bus/usb/001/001:콜론을 사용하여 해당 내용에 액세스하려고 하는 것입니다.

접미사 제거 확장을 사용하여 다음과 같이 후행 콜론을 제거할 수 있습니다.

devis=${devis%:}

awk에서( 없이) 이 작업을 수행하는 또 다른 방법 readlsusb.lsusb

프로세스 대체가 있는 쉘에서:

read x buss x devis x < <(lsusb -d 04f9:0272)
devis=${devis%:}
chmod +w "/dev/bus/usb/$buss/$devis"

또는 파이프를 사용하십시오.

lsusb -d 04f9:0272 | {
   read x buss x devis x
   devis=${devis%:}
   chmod +w "/dev/bus/usb/$buss/$devis"
}

답변3

ls -l주석에서 장치의 출력을 제공합니다.

crw-rw-r-- 1 root lp 189, 1 Jul 24 18:48 /dev/bus/usb/001/002

사용자와 그룹에 이미 읽기/쓰기 액세스 권한이 있음을 알 수 있습니다. 따라서 그룹에 사용자를 추가하는 경우 lp스크립트 콘텐츠가 필요하지 않습니다.

관련 정보