(gelöst) richtige usb NR in script einfügen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

(gelöst) richtige usb NR in script einfügen

Beitrag von michaa7 » 21.08.2024 18:06:39

Mein s2pdf funktioniert nun wie es soll.

Eine Optimierung hätte ich noch gerne erledigt:

Die USB-Nr. ist zum Ansprechen des Geräts notwendig, kann sich aber ändern (wenn man das Kabel umsteckt und vllt auch aus anderen Gründen)

Ich würde daher gerne mein script so ändern, dass der Gerätename immer neu gecheckt und die entsprechende Variable neu gesetzt wird. Ich kann das nur als Pseudocode angeben wie das funktionieren soll.

aktuelles script mit Pseudocode und Änderung in blau:
#!/bin/bash


if [ -z "$1" ]; then
echo 'Please provide the name of the output PDF file.'
exit 1
fi

SCAN_DIR=/home/mh/temp/_scans

if [ ! -d $SCAN_DIR ]; then
mkdir -p $SCAN_DIR
fi

# Pseudocode:
# DNAME=<output aus "scanimage -L" \
# -> device `genesys:libusb:003:003' is a Canon LiDE 110 flatbed scanner
# zwischen "`" und "'"
# sowas in dieser Art:
# scanimage -L | sed 's/.*` \(.*\)'/\1/'
# das funktioniert nicht weil laienhaft aus dem Nezt zusammenkopiert


scanimage \
-d "genesys:libusb:003:003" \ #Zeile geändert in: -d "$DNAME"
--batch=$SCAN_DIR/out%d.pnm \
--source "Flatbed" \
-x 210 -y 297 --resolution 300 \
--batch-prompt


# gm convert $SCAN_DIR/out*.pnm $1
convert $SCAN_DIR/out*.pnm $SCAN_DIR/$1

rm $SCAN_DIR/out*.pnm

Kann jemand weiterhelfen?
Zuletzt geändert von michaa7 am 21.08.2024 23:29:57, insgesamt 1-mal geändert.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: richtige usb NR in script einfügen

Beitrag von michaa7 » 21.08.2024 21:08:24

Ok, es sind also mehrere Probleme:

A)
Ich habe keine Ahnung wie ich die Ausgabe von "scanimage -L" an grep/sed/ was auch immer weiterreiche. Eine Verknüpfung mittels "|" scheint nicht der richtige weg.

B)
Daher erstmal diese Problem umgangen um erstmal den filter zu bauen, mit grep:

Code: Alles auswählen

echo "device `genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner" | egrep -oP "(?<=`).*?(?=')
Als Ergebnis erhoffe ich "genesys:libusb:003:006", erhalte aber "bash: command substitution: Zeile 1: Dateiende beim Suchen nach »'« erreicht.
device ).*?(?>=')"

Da ist noch viel Luft nach oben möglich :mrgreen:

Wenn ich die Aufgabe in Pseudocode zerlege mit meinem minimalsten grep perl Verständnis dann lauten die Teilaufgaben:
Gehe den echostring entlang und verwirf alles bis zu zu "`" kommst. Danach ist alles ein match. Wenn du zu "'" kommst brich ab.
Das Ende stimmt, der Anfang stimmt auch ... fast, es wir halt genau das Falsche behalten und das richtige verworfen. Man ....
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

HumiNi
Beiträge: 554
Registriert: 02.10.2014 21:46:18

Re: richtige usb NR in script einfügen

Beitrag von HumiNi » 21.08.2024 22:03:18

Poste Ein- und Ausgabe, dann kann bestimmt jemand helfen.
Es macht übrigens viel wacher, den Kaffee über die Tastatur zu kippen, statt ihn zu trinken.

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: richtige usb NR in script einfügen

Beitrag von michaa7 » 21.08.2024 22:05:31

Steht doch da:

Code: Alles auswählen

$ echo "device `genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner" | egrep -P  "(?<=`).*?(?=')"
bash: command substitution: Zeile 1: Dateiende beim Suchen nach »'« erreicht.
device ).*?(?=')
Ausgabe soll sein ( als Schritt 1):
genesys:libusb:003:006
Und das echo blabla nutze ich nur weil ich überhaupt nicht weiß wie ich "scanimage -L" mit "grep was-weiß-ich" verbinden kann. Ne einfache pipe "|" tut es nicht.
Zuletzt geändert von michaa7 am 21.08.2024 22:13:52, insgesamt 1-mal geändert.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: richtige usb NR in script einfügen

Beitrag von tobo » 21.08.2024 22:10:26

Du sagst es selbst, bis ` funktioniert alles - das ` verliert innerhalb zweier " nicht seine Sonderbedeutung und versucht somit eine Kommandosubstitution (`...`, "neuerdings" mit $(...) geschrieben) einzuleiten. Damit es als normales Zeichen fungiert, muss ihm die Sonderbedeutung durch starkes Quoting (stehend inmitten zweier ') oder durch direktes Escapen mit \ genommen werden. Z.B. so:

Code: Alles auswählen

$ echo "device \`genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner" | grep -oP "(?<=\`).*?(?=')"
genesys:libusb:003:006
$
Das grep sollte auch Frage A) beantworten?!

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: richtige usb NR in script einfügen

Beitrag von michaa7 » 21.08.2024 22:34:02

tobo hat geschrieben: ↑ zum Beitrag ↑
21.08.2024 22:10:26
Du sagst es selbst, bis ` funktioniert alles - das ` verliert innerhalb zweier " nicht seine Sonderbedeutung und versucht somit eine Kommandosubstitution (`...`, "neuerdings" mit $(...) geschrieben) einzuleiten. Damit es als normales Zeichen fungiert, muss ihm die Sonderbedeutung durch starkes Quoting (stehend inmitten zweier ') oder durch direktes Escapen mit \ genommen werden. Z.B. so:

Code: Alles auswählen

$ echo "device \`genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner" | grep -oP "(?<=\`).*?(?=')"
genesys:libusb:003:006
$
Das grep sollte auch Frage 1 beantworten?!
Janeineinein.

Auf die Ausgabe von "scanimage -L" mit dem `...' Quoting habe ich ja keinen Einfluß. Ich müsste den output ja erst abfangen, das `durch \` ersetzen und dann die Zeile an grep verfüttern. (Und dann weiß ich immer noch nicht ob ich das irgendwie in mein Script bekomme ..)

Danke fürs vorbeischauen und helfen. Hätte nicht gedacht so nah am Ergebnis zu sein. Vllt schaust ja wiedermal vorbei ... ist ja noch nicht erledigt.
Ich hab ja noch nichtmal herausgefunden wie ich mit grep auf den output von "scanimage -L" zugreifen kann ... da kommt immer nur ">"

Danke in jedem Fall.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: richtige usb NR in script einfügen

Beitrag von tobo » 21.08.2024 22:40:13

Du hast das grep - so wie es da (mit \`) steht - genommen und es funktioniert nicht als | hinter scanimage?

Code: Alles auswählen

scanimage -L | grep -oP "(?<=\`).*?(?=')"

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: richtige usb NR in script einfügen

Beitrag von michaa7 » 21.08.2024 22:49:54

Also damit habe ich heut den ganzen Abend verbracht und immer ein ">" als Ergebnis erhalten, mit dem ich ncihts anzufangen wußte. Ich habe auch escaped wie wild, aber war wohl unaufmerksam ... du hast recht ... es klappt wie es soll. Danke auch dafür.

Ich verstehe absolut nicht warum das auch `auch in der echo zeile escaped weerrden muss, die Ausgabe von scanimage -L enthält das auch und muß nicht escaped werden ... 8O

Jetzt muß ich das nur noch richtig in das Script basteln ... ma schaun ...
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: richtige usb NR in script einfügen

Beitrag von tobo » 21.08.2024 23:24:28

michaa7 hat geschrieben: ↑ zum Beitrag ↑
21.08.2024 22:49:54
Ich verstehe absolut nicht warum das auch `auch in der echo zeile escaped weerrden muss, die Ausgabe von scanimage -L enthält das auch und muß nicht escaped werden ...
Und woher weißt du das? Wenn Scanimage diese Ausgabe macht, dann muss es auch dafür sorgen, dass keine einzelnen und damit offenen ', ", oder ` im Text rumstehen.
Würde scanimage das so machen:

Code: Alles auswählen

$ echo "device `genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner"
>
dann würdest du ja das >

Code: Alles auswählen

$ echo $PS2
>
$

(also den PS2) sehen. Also macht scanimage "intern" das wohl grundsätzlich so:

Code: Alles auswählen

$ echo "device \`genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner"
device `genesys:libusb:003:006' is a Canon LiDE 110 flatbed scanner
$
und das entspricht ja auch dem, was du siehst. Die Quoten das natürlich intern richtig - so wie der String reingeht, so muss er ja nicht rausgehen. Das was du siehst, das ist ja nur das Ergebnis...

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: richtige usb NR in script einfügen

Beitrag von michaa7 » 21.08.2024 23:28:26

EDIT:
Ich hatte den echo string nie für sich ausgeführt, sondern immer irgend ein "| grep ..." angehängt. Ich kam gar nicht darauf dass das ">" (was auch immer PS2 bedeutet) durch etwas anderes als einen fehlerhaften grep ausgelöst worden wäre. Und dass scanimage intern Dinge escaped und ich das in der Ausgabe nicht sehen kann, dazu braucht man wirklich dein Wissen ... da bin ich kilometerweit entfernt.
EDIT/:


OK, so sieht das fertige script aus. Es muss mit "<scriptname> <zieldatei>.pdf" gestartet werden und scannt zunächst den richtigen Gerätenamen! Das dauert ein paar, 4-5 Sekunden, dann kann man beliebig viele Scanns durchführen, wobei jeder neue Scannvorgang durch die Eingabetaste ausgelöst wird. Nach dem letzten Scann wird mit strg-D abgebrochen. Es gibt dann eine Abfrage ob die Scanns (NICHT das PDF!) gelöscht werden sollen! 1-2 files werden einzeln gelöscht, ab 3 wird nach allen auf einmal gefragt. Das hängt an der Art wie "rm" arbeitet. Das PDF liegt in ~/temp/_scans/ und sollte manuel in den richtigen Ordner geräumt werden.

s2pdf

Code: Alles auswählen

#!/bin/bash


if [ -z "$1" ]; then
        echo 'Please provide the name of the output PDF file.'
        exit 1
fi

SCAN_DIR=/home/mh/temp/_scans
DNAME=$(scanimage -L | grep -oP "(?<=\`).*?(?=')")

if [ ! -d $SCAN_DIR ]; then
        mkdir -p $SCAN_DIR
fi

scanimage \
        --device-name=$DNAME \
        --batch=$SCAN_DIR/out%d.pnm \
        --source "Flatbed" \
        -x 210 -y 297 \ 
        --resolution 300 \
	--brightness 18 \
        --contrast 100 \
        --batch-prompt


# gm convert $SCAN_DIR/out*.pnm "$1"
convert $SCAN_DIR/out*.pnm $SCAN_DIR/"$1"

rm --interactive=once -i $SCAN_DIR/out*.pnm
Viel gelernt heute durch die Helfer.

Danke.
Zuletzt geändert von michaa7 am 23.08.2024 16:19:18, insgesamt 3-mal geändert.
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: richtige usb NR in script einfügen

Beitrag von tobo » 22.08.2024 08:39:49

2 Anmerkungen noch:
-Der PS2 ist ein Shell-Prompt, der dann angezeigt wird, wenn die Eingabe des zuvor eingegebenen Befehls noch nicht beendet ist. Also z.B. dann, wenn ein öffnendes ', " oder ` kein schließendes ', " oder ` vorfindet und der Befehl somit syntaktisch nicht korrekt ist.
- $1 solltest du im Skript grundsätzlich durch "$1" noch 2x quoten, sonst bekommst du durch z.B. etwaige Leerzeichen im übergebenen Argument Probleme, auch wenn die praktisch überhaupt keinen Sinn machen.

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: richtige usb NR in script einfügen

Beitrag von michaa7 » 22.08.2024 10:23:56

tobo hat geschrieben: ↑ zum Beitrag ↑
22.08.2024 08:39:49
2 Anmerkungen noch:
-Der PS2 ist ein Shell-Prompt, der dann angezeigt wird, wenn die Eingabe des zuvor eingegebenen Befehls noch nicht beendet ist. Also z.B. dann, wenn ein öffnendes ', " oder ` kein schließendes ', " oder ` vorfindet und der Befehl somit syntaktisch nicht korrekt ist.
Danke für diese Erklärung. Damit weiß ich das bei der nächsten Gelegenheit besser zu deuten!
EDIT:
Allerdings verstehe ich nicht warum das `escaped werden muß, das ' in der echo Zeile, entgegen deiner Anmerkung hier, keine ungewollten Auswirkungen zeigt?
/EDIT:
tobo hat geschrieben: ↑ zum Beitrag ↑
22.08.2024 08:39:49
- $1 solltest du im Skript grundsätzlich durch "$1" noch 2x quoten, sonst bekommst du durch z.B. etwaige Leerzeichen im übergebenen Argument Probleme, auch wenn die praktisch überhaupt keinen Sinn machen.
Yes, sir. Done!
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: richtige usb NR in script einfügen

Beitrag von tobo » 23.08.2024 12:11:03

michaa7 hat geschrieben: ↑ zum Beitrag ↑
22.08.2024 10:23:56
EDIT:
Allerdings verstehe ich nicht warum das `escaped werden muß, das ' in der echo Zeile, entgegen deiner Anmerkung hier, keine ungewollten Auswirkungen zeigt?
-Starkes Quoting mit '...': Innerhalb verlieren alle Zeichen außer das ' selbst ihre Sonderbedeutung
-Schwaches Quoting mit "...": Innerhalb verlieren alle Zeichen außer $, \ und ` ihre Sonderbedeutung
Siehe:

Code: Alles auswählen

$ echo "'"
'
$ echo "`"
>

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) richtige usb NR in script einfügen

Beitrag von michaa7 » 23.08.2024 12:51:13

Wow, vielen Dank für die Erklärung!
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) richtige usb NR in script einfügen

Beitrag von michaa7 » 24.08.2024 14:48:32

V2:

Code: Alles auswählen

       
#!/bin/bash

outfile=${1-}
while [[ ! $outfile ]]; do
  read -p 'Name of the output PDF file: ' -r outfile
done

#if [ -z "$1" ]; then
#       echo 'Please provide the name of the output PDF file.'
#       exit 1
#fi

SCAN_DIR=/home/mh/temp/_scans
DNAME=$(scanimage -L | grep -oP "(?<=\`).*?(?=')")

if [ ! -d $SCAN_DIR ]; then
        mkdir -p $SCAN_DIR
fi

scanimage \
        --device-name=$DNAME \
        --batch=$SCAN_DIR/out%d.pnm \
        --source "Flatbed" \
        -x 210 -y 297 \
        --resolution 300 \
        --brightness 18 \
        --contrast 100 \
        --batch-prompt
        
        

# gm convert $SCAN_DIR/out*.pnm "$outfile"
convert $SCAN_DIR/out*.pnm $SCAN_DIR/"$outfile"

rm --interactive=once -i  $SCAN_DIR/out*.pnm

gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

michaa7
Beiträge: 4916
Registriert: 12.12.2004 00:46:49
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) richtige usb NR in script einfügen

Beitrag von michaa7 » 24.08.2024 20:53:23

V3 (edit):

Code: Alles auswählen

#!/bin/bash

# Kein Kommandozeilenargument? $# enthält die Anzahl der dem Skript übergebenen Argumente
if [ $# -lt 1 ]; then
    # Frage nach einem Dateinamen, read schreibt in die Variable $outfile
    read -p 'Name of the output PDF file: ' -r outfile
else
    # Da war ein Kommandozeilenargument
    outfile=$1
fi

# Falls ein leeres Kommandozeilenargument übergeben wurde oder die Frage leer beantwortet wurde
if [ -z "$outfile" ]; then
    echo 'Please provide the name of the output PDF file.'
    exit 1
fi

SCAN_DIR=/home/mh/temp/_scans
echo 'Warten bis Scanner bereit ...'
DNAME=$(scanimage -L | grep -oP "(?<=\`).*?(?=')")

if [ ! -d $SCAN_DIR ]; then
        mkdir -p $SCAN_DIR
fi

scanimage \
        --device-name=$DNAME \
        --batch=$SCAN_DIR/out%d.pnm \
        --source "Flatbed" \
        -x 210 -y 297 \
        --resolution 300 \
        --brightness 18 \
        --contrast 100 \
        --batch-prompt    


# gm convert $SCAN_DIR/out*.pnm "$outfile"
convert $SCAN_DIR/out*.pnm $SCAN_DIR/"$outfile"

rm --interactive=once -i  $SCAN_DIR/out*.pnm      
        
gruß

michaa7

-------------------------------
Menschen ändern gelegentlich ihre Ansichten, aber nur selten ihre Motive. (Oskar Negt)

Antworten