Thread Wie findet das Perlscript meinen Ordner!? (15 answers)
Opened by lin at 2010-09-27 20:31

topeg
 2010-09-27 23:46
#141539 #141539
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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:
Code: (dl )
1
2
Aktuelles Arbeitsverzeichnis: /home/lin/
Vollständiger Scriptpfad: /home/lin/Desktop


wechsle in das Verzeichnis Desktop: cd ~/Desktop uns schreibe: perl ~/Desktop/script_tests.pl die Ausgabe ist nun:
Code: (dl )
1
2
Aktuelles Arbeitsverzeichnis: /home/lin/Desktop
Vollständiger Scriptpfad: /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:
Code: (dl )
1
2
Das ist nur ein Test.
Diese Datei hat zwei Zeilen!


die Ordnerstruktur soll sein:
Code: (dl )
1
2
/home/lin/perl_tests/read_print.pl
/home/lin/perl_tests/test.txt


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
2
lin@linux:~$ /home/lin/perl_tests/read_print.pl
ERROR open ./test.txt (Datei oder Verzeichnis nicht gefunden)
Das liegt daran das die Datei in /home/lin/test.txt gesucht wurde. Sie liegt aber im selben Verzeichnis wie das Script. Hier kannst du das Modul CPAN:FindBin benutzen:
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 CPAN:File::Spec benutzen. Das kann die verschiedenen Pfadtrenner handhaben.

Ich hoffe das hilft dir ein wenig weiter

View full thread Wie findet das Perlscript meinen Ordner!?