#!/bin/bash declare -r filename='scanQr-%05d.txt' qrfilename='scanQr-%05d.png' declare -i filenum=1 qrfilenum=1 die() { echo >&2 "ERROR ${0#*/}: $@" exit 1 } oggPlayer=$(which ogg123) [ "$oggPlayer" ] || die "Can't find 'ogg123' tool." QRScanner=$(which zbarcam) [ "$QRScanner" ] || die "Can't find 'zbarcam' tool." readySnd=/usr/share/sounds/KDE-KStars-Sys-App-Message.ogg scanSnd=/usr/share/sounds/KDE-KStars-Finish-Success.ogg [ -x "$oggPlayer" ] || die "Can't execute '$oggPlayer'." [ -x "$QRScanner" ] || die "Can't execute '$QRScanner'." [ -r "$readySnd" ] || die "Can't access '$readySnd'." [ -r "$scanSnd" ] || die "Can't access '$scanSnd'." check4QRScanner() { local maj min rev IFS=$'.\n' read -r maj min rev < <($QRScanner --version) (( ( maj > 0 ) || ( min > 23 ) || ( min = 23 && rev >= 1) )) && return die "Require zbar-tools V >= 0.23.1 for correct binary scan." } getOneQr() { local -n _gC_res=${1:-QRCode} local _gC_line IFS= read -u $scan -r _gC_res _gC_res+=$'\n' while IFS= read -u $scan -t .02 -r _gC_line; do _gC_res+="$_gC_line"$'\n' done _gC_res="${_gC_res%$'\n'}" } check4QRScanner exec {ogg}> >( exec stdbuf -o0 $oggPlayer --audio-buffer 0 -b 8 -p 0 -q - &>/dev/null) oggpid=$! exec {scan}< <( exec stdbuf -i0 $QRScanner -q --raw -Sbinary 2>/dev/null $1) scanpid=$! cat >&$ogg "$readySnd" while :;do if read -t 0 -u $scan && getOneQr res ;then cat >&$ogg "$scanSnd" # Do something automatically here, with "$res" xclip <<<"$res" fi if IFS= read -sn 1 -t .2 userKey ;then case $userKey in e ) echo EXIT.; break ;; # Do something there, on user demand... c ) xclip <<<"$res" ;; n ) clear;cat -n <<<"$res" ;; r ) echo "$res" ;; s ) while printf -v file "$filename" $filenum;[ -f "$file" ] ;do filenum+=1 done printf "%s" "$res" >"$file" && ls -l "$file" ;; q ) while printf -v file "$qrfilename" $qrfilenum;[ -f "$file" ] ;do qrfilenum+=1 done qrencode -o "$file" < <(printf "%s" "$res") ls -l "$file" ;; p ) printf '%3dl %3dw %3dc <%q>\n' $(wc <<<"$res") "$res" ;; esac fi done exec {ogg}>&- exec {scan}<&- [ -d /proc/$oggpid ] && kill $oggpid [ -d /proc/$scanpid ] && kill $scanpid