Który katalog reprezentuje ścieżka `//` w systemie Linux?


13

Kiedy chcę wrócić do katalogu wyższego poziomu w Linuksie cd .., piszę na maszynie cd //. Ku memu wielkiemu zdziwieniu nie zgłoszono żadnych błędów. Co więcej, pojawia się monit username@hostname://$. lswskazuje, że jestem teraz w katalogu głównym.

Czy to błąd czy funkcja powłoki? Jeśli funkcja jest //aliasem /? Moja powłoka to GNU bash, wersja 4.1.5 (1) -release (i686-linux-gnu).

Dziękuję i pozdrawiam.


Odpowiedzi:


30

Można to również rozważyć.

W Linuksie //nic nie znaczy - wiele kolejnych ukośników zostaje zwiniętych do jednego, w dowolnym miejscu na ścieżce, w tym na początku. Zmiana katalogu na //umieszczenie cię /, jak readlink /proc/self/cwdpowiedziałby bieg ; podobnie /usr//local///binjest zwinięty /usr/local/bin.

Jednak niektóre inne systemy uniksowe, na przykład Cygwin lub stara domena / system Apollo, używają // prefiksu dla ścieżek sieciowych, takich jak //fileserver/path/to/data. POSIX również na to pozwala.

Z różnych powodów powłoka bash samodzielnie śledzi bieżący katalog (oprócz śledzenia dostarczonego przez system operacyjny) i zawiera kod, który zapobiega //zwinięciu inicjału , aby zachować zgodność z takimi systemami. „Cechą” jest to, że bash zapewnia bardziej intuicyjne śledzenie bieżącego katalogu, na przykład, gdy wchodzisz w cddowiązanie symboliczne, bash pokaże ci oczekiwaną ścieżkę, nawet jeśli jądro myśli inaczej. „Błąd” polega na tym, że bash pozwala //nawet na systemy, które go nie używają.


Co ciekawe, zshpozwala cd //, ale jest wystarczająco sprytny, aby pokazać go /w ciągu zachęty.
new123456

@BinaryZebra Bitsavers ma kolekcję starych instrukcji Uniksa, w tym Apollo - powinno być tam mnóstwo przykładów. Strona TUHS również powinna mieć coś.
user1686,

Wielkie dzięki, znalazłem opis // w instrukcji Bitsavers.

9

Z definicji ścieżki POSIX:

Nazwa ścieżki może opcjonalnie zawierać jeden lub więcej ukośników końcowych. Wiele kolejnych ukośników uważa się za takie same jak jeden ukośnik.

Źródło

A dokładniej, jak grawitacja wspomniała w swoim komentarzu poniżej, z rozdziału 4.11 na temat rozwiązywania nazw ścieżek :

Ścieżka rozpoczynająca się od dwóch kolejnych ukośników może być interpretowana w sposób zdefiniowany w implementacji, chociaż więcej niż dwa początkowe ukośniki należy traktować jako pojedynczy ukośnik.


1
Bardziej odpowiednią sekcją jest 4.11 Rozpoznawanie nazw ścieżek (ostatni akapit), ponieważ dane zachowanie pojawia się tylko w przypadku dwóch wiodących ukośników.
user1686

3

To rodzaj funkcji. Jeśli masz uruchomiony skrypt powłoki i używasz go find, na przykład wszystkie ścieżki są poprzedzone ./ zwykle. Następnie, jeśli umieścisz go na rzeczywistej ścieżce, stanie się on `/my/path/./appended/path, co zostanie przetłumaczone na / my / path / appended / path. Więc, jeśli się nie mylę, // get zostanie zinterpretowane jako /./ i dlatego /. To samo dotyczy sytuacji, gdy odwiedziłeś / home / user //, skończyłbyś w / home / user /


1

Chciałbym wyświetlić monit o wyświetlenie „błędu”.

Każda ze ścieżek „/”, „//”, „//////////////////////”, ... ma takie samo znaczenie: „/”. Możesz dodać dowolną liczbę „/” w dowolnym miejscu na ścieżce uniksowej, co nie zmienia jej znaczenia.

„Błąd” jest tutaj bardziej związany z faktem, że w wierszu polecenia wyświetlana jest ostatnia poprawna wpisana ścieżka, a nie rzeczywiste „pwd”.

W każdym razie śmieszne;)


Zgoda - //w pytaniu jest efektem ubocznym twojej zmiennej środowiskowej ( $PS1) - jak to PS1zdefiniować?
Doug Harris

@DougHarris $PS1zmienna jest zdefiniowana jako [\u@\h \W]\$. Masz problem z ustawieniem?
Summer_More_More_Tea

Dziwny. Jeśli spróbuję tego PS1, dostanę go tylko /wtedy, gdy pwd = /. Zastanawiałem się, czy wykonujesz jakąś dodatkową pracę, aby uzyskać katalog. Jest $PROMPT_COMMANDustawiony?
Doug Harris

@DougHarris Tak, ta zmienna jest ustawiona, której wartość to echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Czy mógłbyś wyjaśnić trochę szczegółowo? Nie jestem do końca zaznajomiony z tymi dwiema zmiennymi. Dzięki.
Summer_More_More_Tea

Przeczytaj stronę podręcznika użytkownika bash i wyszukaj PS1i PROMPT_COMMAND- użyj man bashw wierszu polecenia lub czytaj online
Doug Harris

1

Jest to funkcja, a wszystkie wielokrotne // zostaną zastąpione jednym /

Jest to przydatne, jeśli masz zmienne ze ścieżkami takimi jak przykład na końcu. Tak więc na twoim dysku CD nie wystąpił błąd i nie musisz zmieniać zmiennej obszaru roboczego.

MY_WORKSPACE = / home / twoja_nazwa_użytkownika / workspace /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

cała zawartość zmiennej projektu to

/ home / twoja_nazwa_użytkownika / workspace // mój_proj /

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.