2012-11-05 11 views
5

Oto powód, dla którego zadaję to pytanie: piszę dużo skryptów bash i Perl, i często muszę się łączyć ze sobą dwie ścieżki. Coś jak to jest typowe:W jaki sposób Unix odczytuje nazwę ścieżki z dwoma kolejnymi ukośnikami? (np./home/user // mystuff)

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

Problem polega na tym, że nie zawsze pamiętać, jeśli mogę umieścić ukośnik na końcu prefiksu, lub jeśli mogę umieścić ukośnik na początku sufiksu. Mogłem więc przypadkowo połączyć dwa cięcia razem, tak jak w powyższym przykładzie.

Moje główne pytanie dotyczy tego, czy dwa kolejne ukośniki spowodują jakiekolwiek problemy i dlaczego. Ale czy programiści mają na to konwencję? W kodzie, który piszą inni, czy nazwy katalogów zawsze kończą się ukośnikiem? Byłoby miło, gdyby istniała jakaś spójna zasada, którą mógłbym zastosować.

+0

Sugerujemy rozważenie użycia modułu takiego jak 'Plik :: Spec' lub podobny, który obsługuje wszystkie separatory dla ciebie, specyficzne dla platfor m działa skrypt, co poprawia przenośność. – David

Odpowiedz

5

Jest całkowicie w porządku. Wielokrotne ukośniki są traktowane przez systemy uniksowe, więc zawsze je dodawaj.

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

Ale jeśli chcesz kanonizowany ścieżkę z jakiegokolwiek powodu (np to będzie wyświetlony użytkownikowi), można użyć:

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

czy zacząć /home/user, /home/user/ lub nawet ///home///user/// , kończysz z:

/home/user/mystuff 
+0

Byłoby to bardziej wydajnie napisane jako 'dir ($ prefix, $ suffix)'. – cjm

+0

@cjm, Oznaczałoby to, że twój kod zawierałby mieszaninę obiektów Path :: Class i zwykłych ścieżek. Mój kod nie miałby tego. 'Dir ($ prefix)' zostanie wykonany na długo przed użyciem '$ sufiksu'. – ikegami

+0

@cjm, ja też wątpię, że warto wspomnieć o oszczędnościach. – ikegami

5

Unix skorupy i jądra szczęśliwie z tym poradzić, jak również takie rzeczy jak „/firstpart/./secondpart”, ale na ogół nie sprawiają trailing slash część wartości zmiennej do wyrażenia concatenation ścieżka wyglądają ładniej: $ {firstpart}/$ {secondpart} zamiast $ {firstpart} $ {secondpart}.

W skryptach w systemie Linux można użyć narzędzia wiersza poleceń w celu znormalizowania nazw plików.