Thread Wie findet das Perlscript meinen Ordner!?
(15 answers)
Opened by lin at 2010-09-27 20:31
Starten von Scripten und ihre Pfade:
Unter Linux und anderen Unixoiden Systemen ist der Pfadtrenner '/' alle absoluten Pfade fangen mit '/' an. Das ist der "Root" die Wurzel des Dateisystems, alle Dateien und Ordner im system sind von hier aus zu erreichen. Andere Dateisysteme (Fesplatten CDs etc) bekommen einen Ordner in diesem Dateisystem. Wenn du also Pfade ohne ein '/' am Anfang hast sind es "Relative" Pfade (ansonsten "Absolute" Pfade) und beziehen sich entweder auf aktuelle Arbeitsverzeichnis oder das Verzeichnis in dem sich das Programm befinden, das die Pfade interpretiert (dein Script zum Beispiel). "." ist ein Synonym für das aktuelle Verzeichnis '..' bezeichnet das darunterliegende. Wie kannst du das nutzen. Nehmen wir an wir hätten eine Script dieser Art: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 #!/usr/bin/perl use strict; use warnings; use Cwd; use FindBin qw($Bin); print "Aktuelles Arbeitsverzeichnis: ".getcwd()."\n"; print "Vollständiger Scriptpfad: $Bin \n"; Nun speicherst du es auf deinem Desktop. Als Bezug nehme ich jetzt mal /home/lin/Desktop/script_tests.pl nun startest du ein Shell-Terminal. Das wird bei mir "Terminal" genannt. und befindet sich im Menu unter "Sonstiges". Aber ich benutze Debian und weiß nicht wo OpenSuse das Programm eingeordnet hat. Es sollte sich ein Fenster öffnen in dem in dem du eine Textzeile der Art siehst: lin@Linux:~/$ nun ein paar Tests: schreibe: perl ~/Desktop/script_tests.pl nach einem return solltest du ein Ausgabe der Art bekommen: wechsle in das Verzeichnis Desktop: cd ~/Desktop uns schreibe: perl ~/Desktop/script_tests.pl die Ausgabe ist nun: Code: (dl
)
1 Aktuelles Arbeitsverzeichnis: /home/lin/Desktop Es wäre doch schön das "perl" vor dem Scriptnamen weglassen zu können. Das geht. Im Script steht ja in der ersten Zeile #!/usr/bin/perl . Das ist das so genannte "Shebang" ( http://de.wikipedia.org/wiki/Shebang ). Das definiert mit welchem Programm der nachfolgende Code ausgeführt werden soll. (hier '/usr/bin/perl') Das Alleine reicht aber noch nicht aus. Du musst dem Betriebssystem noch mitteilen, dass es sich um eine ausführbare (executable) Datei handelt. Das Kannst du entweder grafisch machen, indem du die Ausführbarkeit in den dateiEigenschaften änderst oder auf dem Terminal mittels: chmod u+x ./script_tests.pl (wenn du im selben Ordner bist.) Hast du das gemacht solltest du die datei einfach per doppelklick (wahrscheinlich wirst du gefragt ob du das programm im Terminal ausführen möchtest oder direkt. Das macht bei dem kleinen Script keinen unterschied, da sich das terminal sofort wieder schließt nachdem das Script beendet wurde.) oder im Terminal mit ./script_tests.pl starten können. Schreiben wir ein komplexeres Script read_print.pl, das eine Datei öffnet, ließt und ausgibt: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 #!/usr/bin/perl use strict; use warnings; my $filename='./test.txt'; open(my $fh, '<', $filename) || die("ERROR open $filename ($!)\n"); while(my $line=<$fh>) { print $line; } close($fh); test.txt soll enthalten: die Ordnerstruktur soll sein: wenn du in den Ordner /home/lin/perl_tests/ wechselst (cd /home/lin/perl_tests) und das Script startest wird die Datei ohne Probleme ausgeben: Code (perl): (dl
)
1 2 3 lin@linux:~/perl_tests$ ./read_print.pl Das ist nur ein Test. Diese Datei hat zwei Zeilen! Startest du das Script aber von anders aus. z.B. von /home/lin mittels /home/lin/perl_tests/read_print.pl wirst du eine Ausgabe der Art bekommen: Code: (dl
)
1 lin@linux:~$ /home/lin/perl_tests/read_print.pl Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/perl use strict; use warnings; use FindBin qw($Bin); my $filename='./test.txt'; my $real_filename="$Bin/$filename"; open(my $fh, '<', $real_filename) || die("ERROR open $real_filename ($!)\n"); while(my $line=<$fh>) { print $line; } close($fh); Nun funktioniert die das öffnen der Datei immer egal von wo aus du das Script startest. Im Script wird der relative Pfad um den absoluten vom Script ergänzt. Will man das Platformübergreifend korrekt mach so muss man das Modul File::Spec benutzen. Das kann die verschiedenen Pfadtrenner handhaben. Ich hoffe das hilft dir ein wenig weiter |