[bash] Dateinamen mit Leerzeichen im Script korrekt handhabe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

[bash] Dateinamen mit Leerzeichen im Script korrekt handhabe

Beitrag von MoonKid » 27.11.2013 10:37:09

Ich nutze vim-latexsuite. In der vim.rc gibt legt man eine Befehlszeile fest, welche den Latex-Build anstösst.
Problem dabei ist, dass diese in meiner Form keine Dateinamen mit Leerzeichen handhaben kann.

Das ist die Zeile wie sie in der vim.rc steht.

Code: Alles auswählen

let g:Tex_CompileRule_pdf="texout '$*' & sleep 1s && xelatex -interaction=nonstopmode '$*'"
Machen wir mal vereinfacht das draus (texout ist ein eigenes Script von mir)

Code: Alles auswählen

let g:Tex_CompileRule_pdf="texout '$*'"
Der vim selbst öffnet eine Datei mit dem Namen Perkins 2004.tex problemlos und zeigt den Namen auch korrekt in der Statusleiste an.
Mein Script bekommt aber nur Perkins zu sehen.

Eigentlich dachte ich dass die zwei ' dafür sorgen, dass der Dateiname komplett eingefasst wird. Hab nun schon etwas rumexperimentiert, aber noch keine Lösung.

Wenn ich den Befehl manuell auf einer Bash eingeben würde, nehme sage ich natürlich texout "Perkins 2004.tex". Aber wie bilde ich die "Funktion" der Anführugnszeichen auf der Bash in der vim.rc bzw. einem Script ab?

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: [bash] Dateinamen mit Leerzeichen im Script korrekt hand

Beitrag von syssi » 27.11.2013 10:52:16

Mal ein Schuss ins Blaue. Ich kenne die vimrc nicht:

Code: Alles auswählen

let g:Tex_CompileRule_pdf="texout \"$*\""

Benutzeravatar
Meillo
Moderator
Beiträge: 9238
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [bash] Dateinamen mit Leerzeichen im Script korrekt hand

Beitrag von Meillo » 27.11.2013 11:07:48

Es gibt fast keinen Grund $* zu verwenden. Man sollte
es schlicht durch $@ ersetzen. Das ist immer aequivalent, ausser
in Doublequotes. Und da expandiert $@, wie fast immer gewollt, in
Einzelargumente, $* aber in ein Argument.

Deshalb (ohne Vim-Script zu kennen):

Code: Alles auswählen

let g:Tex_CompileRule_pdf="texout \"$@\""
Use ed once in a while!

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] Dateinamen mit Leerzeichen im Script korrekt hand

Beitrag von MoonKid » 27.11.2013 17:35:14

Also um mir meine eigenen Verwirrung mit $* und $@ zu beantworten.
https://www.gnu.org/software/bash/manua ... Parameters

Ich verstehe es dennoch nicht so genau.

Mit $@ löst sich das Problem nicht, weil er Perkins 2006.tex wie zwei Parameter behandelt, was er ja nicht soll. Mit $* geht es scheinbar.

Es gibt innerhalb meines texout-Scripts noch Probleme (siehe unten) und vim-latexsuite selbst spuckt auch noch ne Fehlermeldung am ende raus, von wegen nur ein Dateiname als Parameter sei erlaubt, aber im Script und im tex-Kompiler selbst, kommt der korrekte Dateiname vollständig an. Der Tex-Build selbst läuft auch problemlos.

Nun zum texout-internen Problem.

Code: Alles auswählen

if [ ! -f $file_imark ]; then
  touch $file_imark
else
   exit 1
fi  
In $file_imark befindet sich der Dateinamen-String mit den Leerzeichen. Ich bekomme hier die Meldung über zuviele Argumente. Meines Wissens arbeitet dieses if -f Konstrukt wie find. Aber ein simples Setzen von Quotes hilft hier nicht.
Wie bekomme ich dieses Statement dazu auch Dateinamen mit Leerzeichen korrekt zu behandeln?

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: [bash] Dateinamen mit Leerzeichen im Script korrekt hand

Beitrag von syssi » 27.11.2013 22:08:18

Hier gehoert die Variable auch in Anfuehrungszeichen:

Code: Alles auswählen

if [ ! -f "$file_imark" ]; then
  touch "$file_imark"
else
   exit 1
fi 

MoonKid
Beiträge: 513
Registriert: 12.03.2012 22:36:43

Re: [bash] Dateinamen mit Leerzeichen im Script korrekt hand

Beitrag von MoonKid » 28.11.2013 15:19:06

thx! Das wars. Doch so einfach. ;)

Antworten