2012-11-05 7 views
5

Hier ist der Grund, warum ich diese Frage stelle: Ich schreibe viele Bash- und Perl-Skripte, und ich merke, dass ich immer wieder zwei Pfade verketten muss. So etwas ist typisch:Wie liest Unix einen Pfadnamen mit zwei aufeinanderfolgenden Schrägstrichen? (z. B./home/user // mystuff)

my $prefix = "/home/user/"; 
my $suffix = "/mystuff"; 
... 
chdir $prefix.$suffix; 

Das Problem ist, dass ich nicht immer daran denken, wenn ich einen Schrägstrich am Ende des Präfixes setzen, oder wenn ich einen Schrägstrich am Anfang des Suffix setzen. So könnte ich versehentlich zwei Schrägstriche verketten, wie im obigen Beispiel.

Also meine Hauptfrage ist, ob zwei aufeinanderfolgende Schrägstriche irgendwelche Probleme verursachen und warum. Aber haben Programmierer auch eine Konvention dafür? In dem Code, den andere Leute schreiben, enden Verzeichnisnamen immer mit einem Schrägstrich? Es wäre schön, wenn es eine konsistente Regel gäbe, der ich folgen könnte.

+0

Schlagen Sie in Betracht, ein Modul wie 'File :: Spec' oder ähnliches zu verwenden, das alle Separatoren für Sie behandelt, die für die Plattform spezifisch sind m läuft das Skript und verbessert dadurch die Portabilität. – David

Antwort

5

Es ist völlig in Ordnung. Wiederholte Schrägstriche werden von Unix-Systemen als eine behandelt, also fügen Sie immer eine hinzu.

my $prefix = "/home/user"; # Or "/home/user/" 
my $suffix = "mystuff"; 
my $dir = "$prefix/$suffix"; 

Aber wenn man einen kanonisierten Weg aus irgendeinem Grund wollen (zB es wird einem Benutzer angezeigt werden), können Sie verwenden:

use Path::Class qw(dir); 
my $prefix = dir("/home/user"); # Or "/home/user/" 
my $dir = $prefix->subdir($suffix); 
say $dir; 

Ob Sie mit /home/user, /home/user/ beginnen oder sogar ///home///user/// , enden Sie mit:

+0

Das wäre effizienter als 'dir ($ Präfix, $ Suffix)' geschrieben. – cjm

+0

@cjm, Das würde bedeuten, dass Ihr Code eine Mischung aus Path :: Class-Objekten und einfachen Pfaden hätte. Mein Code würde das nicht haben. Das 'dir ($ prefix)' würde gemacht werden, lange bevor '$ suffix' ins Spiel kommt. – ikegami

+0

@cjm, ich bezweifle auch, dass Effizienzeinsparungen erwähnenswert wäre. – ikegami

5

Unix-Shells und -Kernels behandeln das glücklicherweise genauso wie Dinge wie "/firstpart/./secondpart", aber im Allgemeinen machen Sie keinen Schrägstrich als Teil des Variablenwerts, um Pfadverkettungsausdrücke schöner aussehen zu lassen: $ {firstpart}/$ {zweiter Teil} statt $ {firstpart} $ {zweiter Teil}.

In Skripten unter Linux kann das readlink Befehlszeilenprogramm verwendet werden, um Dateinamen zu normalisieren.

Verwandte Themen