rendegast hat geschrieben:Bei einem ff in wine reagiert dieser bei obigem mit $1 leer so,
als wäre ihm dennoch irgendetwas übergeben worden -> es wird file:///C:/ angezeigt statt Startseite.
Och, nicht nur FF in Wine. Und irgendwas ist ihm auch übergeben worden - ich weiß jetzt auch, was. Ist nur ein bisschen verstümmelt.
Da kommen wir zurück zum Ausgangsproblem (Übergabe der ausgewählten Datei) - scheint ein generelles Problem zu sein. Das in RapidSVN offensichtlich gelöst ist (in meinem Script kommt sie ja als $@ wohlbehalten an) - aber wie? Das muss sich wohl irgendwie hinter dem geheimnisvollen Argument %1 verstecken, das kommt mir doch von anderen Programmen her schon elend bekannt vor.
Der Trick mit den Backslashs
Code: Alles auswählen
winpath=${winpath//'/'/'\\'} # Slashs durch doppelte Backslashs ersetzen
wine 'C:\Program Files\LTC\LTspiceIV\scad3.exe' $winpath
funzt nämlich auch nur unter bestimmten Bedingungen: Sobald im Dateinamen das erste Leerzeichen auftaucht, ist's Essig. Praktisch alle Programme (jedenfalls alle, mit denen ich's probiert habe, und mit allen möglichen Tricks, nicht nur mit den Backslashs), nehmen den nur bis zum ersten Leerzeichen an. Alles, was danach kommt, wird entweder ignoriert oder als zweites [, drittes, viertes, ...] Argument interpretiert. Das äußert sich z.B. so:
Da will der Browser ganz korrekt eine Seite mit dem Link "file:///pfad/dat" öffnen, die's natürlich nicht gibt. Oder so:
Da präsentiert mir der Editor drei Tabs (natürlich leer), überschrieben mit den "Dateinamen" "dat", "ei" und "name.txt". Mit anderen Programmen dasselbe in Grün.
Was z.B. meine selbstgebastelten Shell - Funktionen damit so alles anrichten könnten - nicht auszudenken.
Also: Wie lässt sich ein Dateiname (oder allgemein ein String mit Leerzeichen) korrekt als
ein Argument übergeben? Im Terminal doch ganz einfach:
Im Script:
Das funzt schon wieder nicht mehr, wenn der Wert von $datei ein String mit Leerzeichen ist. Aber nun guck' dir z.B. mal das an:
Das packt's komischerweise. Und das macht das Script / die Shell doch auch nicht alleine, da wird doch auch ein Programm aufgerufen, oder?
Mir schwant langsam: Das Ganze lässt sich doch sicher ganz elegant umgehen, wenn man keinen String, sondern einen Dateideskriptor übergibt (wie offenbar RapidSVN meinem Script) - aber wie? Wer weiß da Genaueres?
(Aus höheren Sprachen wie C, VB, ... ist mir Analoges geläufig als "Kontext", "Call by Reference", "Pointer" oder wie auch immer. Und wie gesagt: Ich vermute, dass sich das hinter dem geheimnisvollen Argument %1 versteckt - das sehe ich bei RapidSVN auch beileibe nicht zum ersten Mal) ...