変数を使用した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でこの操作を実行する別の方法readlsusblsusb

プロセス置換があるシェルでは:

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スクリプトの内容は必要ありません。

関連情報