{ writeShellScriptBin }: writeShellScriptBin "request-usb" '' set -euo pipefail parseArgs() { N_CONSTRAINTS=0 while [[ -n "''${1:-}" ]]; do local x= case "$1" in "--manufacturer" ) N_CONSTRAINTS=$(( $N_CONSTRAINTS + 1 )) MANUFACTURER="$2" shift 2 ;; "--manufacturer="* ) N_CONSTRAINTS=$(( $N_CONSTRAINTS + 1 )) MANUFACTURER=''${1#--manufacturer=} shift 1 ;; "--" ) break ;; *) printUsage ;; esac done } printUsage() { echo "$(caller)" >&2 echo "Usage: request-usb [--manufacturer=MANUFACTURER]" >&2 exit 1 } findFirst() { local d= [[ ''${N_CONSTRAINTS:-0} != 0 ]] || printUsage for d in /sys/bus/usb/devices/* ; do [[ -e "$d/manufacturer" ]] || continue [[ -e "$d/uevent" ]] || continue read -r x < "$d/manufacturer" if ! [[ -z "''${MANUFACTURER:-}" || "$MANUFACTURER" = "$x" ]] ; then continue fi # NOTE: Other predicates here # ... echo -n "$d" return done return 1 } parseArgs $@ d=$(findFirst) export $( cat "$d/uevent" ) sudo chown "$USER" /dev/bus/usb/"$BUSNUM"/"$DEVNUM" echo -n /dev/bus/usb/"$BUSNUM"/"$DEVNUM" ''