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://$
. ls
wskazuje, ż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:
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ę/
, jakreadlink /proc/self/cwd
powiedziałby bieg ; podobnie/usr//local///bin
jest 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 wcd
dowią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ą.źródło
zsh
pozwalacd //
, ale jest wystarczająco sprytny, aby pokazać go/
w ciągu zachęty.Z definicji ścieżki POSIX:
Ź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 :
źródło
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 /źródło
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;)
źródło
//
w pytaniu jest efektem ubocznym twojej zmiennej środowiskowej ($PS1
) - jak toPS1
zdefiniować?$PS1
zmienna jest zdefiniowana jako[\u@\h \W]\$
. Masz problem z ustawieniem?/
wtedy, gdy pwd =/
. Zastanawiałem się, czy wykonujesz jakąś dodatkową pracę, aby uzyskać katalog. Jest$PROMPT_COMMAND
ustawiony?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.PS1
iPROMPT_COMMAND
- użyjman bash
w wierszu polecenia lub czytaj onlineJest 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.
cała zawartość zmiennej projektu to
źródło