Shellprogrammierung - Übergabe eines Dateidescriptors an ein Script

Nachricht
Autor
Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#16 Beitrag von Janka » 03. Mär 2014 16:03

wodim hat geschrieben:
wodim hat geschrieben:

Code: Alles auswählen

echo $@ >&2
liefert (Beispiel):

Code: Alles auswählen

/mnt/data/Geraete/HiFiRack/pre/AmpLog/amp_log.asc

Code: Alles auswählen

echo $1 >&2
übrigens auch.
Aber sobald ein Leerzeichen im Pfad oder Dateinamen auftaucht, wird der String da abgehackt. Bei $1, nicht bei $@.

Wer hat eine plausible Erklärung dafür?
Du willst "$1", nicht $1.

$@ ist auch falsch, denn der entfernt zunächst den Whitespace und klatscht das ganze dann wieder mit Leerzeichen zusammen. Das geht schief, sobald man Tabs oder mehrere Leerzeichen hintereinander im Parameter hat.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wodim
Beiträge: 17
Registriert: 01. Mär 2014 17:29
Wohnort: Gilching

#17 Beitrag von wodim » 03. Mär 2014 21:03

Janka hat geschrieben:Fehler passieren mir doch auch dauernd und da bin ich froh, wenn mich jemand auf den Irrtum hinweist. Sonst bleibt der nämlich stehen und der nächste der es liest macht ihn nach.
Uff, dann isses ja gut. ;)
Ich mache jeden Tag Fehler. Wir müssen eine Kultur entwickeln, in der Fehler nicht als etwas Negatives gesehen werden, sondern als etwas, woraus alle lernen können.
(Aus einem Artikel in der "Süddeutschen", so vielleicht vor 10 Jahren, überschrieben: "Fehler im System") Etwas Mut muss man Herrn Professor schon zugestehen, mancher andere hätte da viel zuviel Angst vor der Gefahr eines "Karriereknicks", würde ich sagen.

http://www.swtr.ch/index.php/de/der-swi ... r&catid=39

Also schau' doch mal, was sich da jetzt als wahrscheinlichste Ursache für das ganze Problem herauskristallisiert. (Will nicht dauernd hin- und herkopieren - wozu gibt's Links? Richtig, zum Anklicken.) :wink:

http://debianforum.de/forum/viewtopic.p ... 74#p979085
Mit einem Computer kann man Probleme lösen, die man ohne ihn nicht hätte.

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#18 Beitrag von Janka » 03. Mär 2014 22:58

wodim hat geschrieben:Etwas Mut muss man Herrn Professor schon zugestehen, mancher andere hätte da viel zuviel Angst vor der Gefahr eines "Karriereknicks", würde ich sagen.

http://www.swtr.ch/index.php/de/der-swi ... r&catid=39
War mir dunkel bekannt. Medizin ist aber auch wirklich furchtbar. Da für Mediziner der Doktorgrad praktisch obgligatorisch ist, steht es um die Qualität der abgelieferten Arbeiten nicht gut, zumal die wenigsten wirklich wissenschaftlich arbeiten wollen. Die wollen einfach kranken Menschen helfen (und 'nen dicken Wagen zum Golfplatz rollen lassen). Um die ganzen "Studien", die ständig zu den abstrustesten Gesundheitsthemen rauskommen geht's da ja noch nichtmal.

Aber ganz generell zum Thema Cargo-Kult in der Wissenschaft kontere ich mit http://dresdencodak.com/2011/04/19/dark-science-09/. Ist inzwischen also schon Popkultur geworden.
Also schau' doch mal, was sich da jetzt als wahrscheinlichste Ursache für das ganze Problem herauskristallisiert. (Will nicht dauernd hin- und herkopieren - wozu gibt's Links? Richtig, zum Anklicken.) :wink:

http://debianforum.de/forum/viewtopic.p ... 74#p979085
Tut mir leid, aber anhand jenes Threads sehe ich das konkrete Problem nicht. Dass es um korrektes Quoting geht hatten wir schon.

Wenn du in einem Shellskript irgendwo Einzelticks setzt, wird der String in den Einzelticks "literal" angenommen, also Variablen nicht aufgelöst. Wenn das in einem deiner Beispiele - wie oben mit gedit - nicht der Fall ist, benutzt du an der Stelle wo diese Quotes beachtet werden keine Bourne-kompatible Shell. Deshalb ist es ja auch so wichtig, die richtigen Quotes zu benutzen. Die Backslashes aus den MS-Windows-kompatiblen Dateipfaden können auch noch stören, wenn sie nicht richtig maskiert worden sind. Das ist alles ziemlich häßlich.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wodim
Beiträge: 17
Registriert: 01. Mär 2014 17:29
Wohnort: Gilching

#19 Beitrag von wodim » 04. Mär 2014 11:41

Janka hat geschrieben:
wodim hat geschrieben:Etwas Mut muss man Herrn Professor schon zugestehen, mancher andere hätte da viel zuviel Angst vor der Gefahr eines "Karriereknicks", würde ich sagen.

http://www.swtr.ch/index.php/de/der-swi ... r&catid=39
War mir dunkel bekannt. Medizin ist aber auch wirklich furchtbar. Da für Mediziner der Doktorgrad praktisch obgligatorisch ist, steht es um die Qualität der abgelieferten Arbeiten nicht gut, zumal die wenigsten wirklich wissenschaftlich arbeiten wollen. Die wollen einfach kranken Menschen helfen (und 'nen dicken Wagen zum Golfplatz rollen lassen).
Oh, da gibt's solche und solche. :wink: Ich musste manchen Arzt schlecht behandeln, um die zu finden, die mich richtig behandeln. :wink: Bis auf einen: Meinen Zahnarzt. Bei dem bin ich schon ewig, der ist einfach Spitze, und der hat bis heute keinen Doktortitel. Was er aber allein mit meinen Beißerchen schon angestellt hat, ist echt reif für eine Doktorarbeit. (Wurzelbehandlung unter einer Brücke u.ä. - hat die Welt schon sowas gesehen?) Ich hab' ihn mal auf das Thema "Doktorarbeit" angesprochen: "Die ruht!"

http://www.zahnarzt-bauer.de/

Seit einem Jahr ist die Hälfte meines Gebisses "neu", und ich habe keinen Cent zugezahlt. Kaum zu glauben? Aber wahr!

Das ist ein Thema, über das es sich lohnt, zu diskutieren, und ich kann eine Menge Erfahrungen mit Ärzten und Krankenkassen weitergeben, von denen alle profitieren können. Passt aber wohl absolut nicht hierher. :wink:
Janka hat geschrieben:Wenn du in einem Shellskript irgendwo Einzelticks setzt, wird der String in den Einzelticks "literal" angenommen, also Variablen nicht aufgelöst. Wenn das in einem deiner Beispiele - wie oben mit gedit - nicht der Fall ist, benutzt du an der Stelle wo diese Quotes beachtet werden keine Bourne-kompatible Shell. Deshalb ist es ja auch so wichtig, die richtigen Quotes zu benutzen. Die Backslashes aus den MS-Windows-kompatiblen Dateipfaden können auch noch stören, wenn sie nicht richtig maskiert worden sind.
Das versuche ich zu verstehen. Schrittweise. Learning by doing. :wink:
Janka hat geschrieben:Das ist alles ziemlich häßlich.
Wieso hässlich?
Mit einem Computer kann man Probleme lösen, die man ohne ihn nicht hätte.

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#20 Beitrag von Janka » 04. Mär 2014 12:08

wodim hat geschrieben:
Janka hat geschrieben:Das ist alles ziemlich häßlich.
Wieso hässlich?
Wenn du die richtige Lösung für dein konkretes Quotingproblem gefunden hast wirst du mir zustimmen.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

wodim
Beiträge: 17
Registriert: 01. Mär 2014 17:29
Wohnort: Gilching

#21 Beitrag von wodim » 04. Mär 2014 12:36

Aaalso so heißt meine übergebene Datei (und so gibt's mir auch "echo $@ >&2" aus:

Code: Alles auswählen

/mnt/data/Geraete/HiFiRack/pre/AmpLog/test blank.asc
Das macht mein Script draus (und so gibt's mir auch "echo $winpath >&2" aus):

Code: Alles auswählen

D:\\Geraete\\HiFiRack\\pre\\AmpLog\\test\ blank.asc
Im Terminal funzt das:

Code: Alles auswählen

wine 'C:\Program Files\LTC\LTspiceIV\scad3.exe' D:\\Geraete\\HiFiRack\\pre\\AmpLog\\test\ blank.asc
-> LTSpice startet und öffnet die Datei.

Aus dem Script nicht:

Code: Alles auswählen

wine 'C:\Program Files\LTC\LTspiceIV\scad3.exe' $winpath
Da sagt mir LTSpice:
D:\\Geraete\\HiFiRack\\pre\\AmpLog\\test\ was not found
Also nächster Versuch:

Code: Alles auswählen

wine 'C:\Program Files\LTC\LTspiceIV\scad3.exe' '$winpath'
Message von LTSpice:
$winpath was not found
Zuletzt geändert von wodim am 04. Mär 2014 21:00, insgesamt 2-mal geändert.
Mit einem Computer kann man Probleme lösen, die man ohne ihn nicht hätte.

wodim
Beiträge: 17
Registriert: 01. Mär 2014 17:29
Wohnort: Gilching

#22 Beitrag von wodim » 04. Mär 2014 13:10

Code: Alles auswählen

winpath=${@//'/mnt/data'/'D:'} 					# /mnt/data ist Wine - Laufwerk D
winpath=${winpath//'/'/'\\'}   					# Slashs durch doppelte Backslash ersetzen
winpath=${winpath//' '/'\ '}   					# Blanks mit Backslashs maskieren
wine 'C:\Program Files\LTC\LTspiceIV\scad3.exe' "$winpath"
Message von LTSpice:
D::\Geraete\HiFiRack\pre\AmpLog\test\ blank.asc contains an invalid path.
Also was war der Fehler? Blanks mit Backslash zu "maskieren". Wenn ich den Befehl weglasse, geht's! Aber nur bei Wine. ;)

Code: Alles auswählen

file=${@//' '/'\ '} # Blanks mit Backslashs maskieren
gedit "$file"
Das funzt. Gab's irgendwelche Probleme? :wink: Also was heißt hier "hässlich"? :wink:
Zuletzt geändert von wodim am 04. Mär 2014 21:29, insgesamt 1-mal geändert.
Mit einem Computer kann man Probleme lösen, die man ohne ihn nicht hätte.

wodim
Beiträge: 17
Registriert: 01. Mär 2014 17:29
Wohnort: Gilching

#23 Beitrag von wodim » 04. Mär 2014 21:18

Janka hat geschrieben:
wodim hat geschrieben:
Janka hat geschrieben:Das ist alles ziemlich häßlich.
Wieso hässlich?
Wenn du die richtige Lösung für dein konkretes Quotingproblem gefunden hast wirst du mir zustimmen.

Janka
Nö. Weißt du, das ist wie mit (u.a.) eben diesem Gerät (auf das meine Pfad- und Dateinamen ja schon hindeuten). :wink:

http://www.elektor.de/forum/foren-ubers ... geStart=11

Das kann man nicht beschreiben, das muss man erlebt haben: Alles "Hässliche" (Mühe, Ärger, ... ) ist vergessen in dem Moment, wo dich so ein Drahtverhau zum ersten Mal mit einer klaren Stimme anspricht.

Seit ein paar Wochen halt u.a. auch eine super Übung, um mich nach der bewährten Methode "learning by doing" in LTSpice 'reinzufummeln. Das ich für mein "richtiges" Projekt auch brauche (gegen das wiederum diese Bastelei immer noch kalter Kaffee ist). Bitte mal informieren!

http://www.politik-sind-wir.de/showthre ... post106357
Mit einem Computer kann man Probleme lösen, die man ohne ihn nicht hätte.

Antworten