Jeden z samouczków, które śledziłem krótko, stwierdził, że cd .
nie ma sensu. Podczas próby odtworzenia problemu pokazanego przez OP w rekursji łącza symbolicznego - co powoduje, że „resetuje się”? , Próbowałem również cd .
, który wykazał ten sam opisany efekt OP ( $PWD
zmienna rosnąca ), z którym można się przeciwdziałać cd -P
.
Zastanawiam się, czy jest jakiś przypadek, w którym ktoś chciałby skorzystać cd .
?
cd-command
Sergiy Kolodyazhnyy
źródło
źródło
cd .
do uruchamiania tych kontroli, ponieważ są one krótkie i proste. Chociaż myślę, że chciałeś, aby pytanie dotyczyło środowiska waniliowego.$PWD
,cd .
zmienia$OLDPWD
się również bieżący katalog. Nie mam (obecnie) pojęcia, dlaczego to może być przydatne, ale ze względu na kompletność…cd .
, chociaż widzę poniższe odpowiedzi, może w przyszłości, ale czasami korzystałem z niego,pushd .
gdy chciałem mócpopd
później wrócić do tego katalogu. np. po uruchomieniu skryptu kompilacji, który to robiconfigure
,cd output...
amake
kiedy to zrobi, chcę wrócić do oryginalnego katalogu. Zamiast utrzymywać własną kopię pliku skryptowego, który różni się od tego, czego wszyscy inni oczekują, po prostu uruchamiam go jakopushd .; ./BuildScriptName.sh; popd
, a to daje mi również swobodępopd
niekiedy, a potempopd
później./bin/cd
tutaj unix.stackexchange.com/q/50058/85039Odpowiedzi:
Myślę, że to przesadza z problemem.
cd .
może nie być czymś, co można by ręcznie uruchomić w zwykłym toku, ale na pewno jest to coś, co może pojawić się przy wykonywaniu programowym (pomyśl o każdej sytuacji, w której możeszcd
przejść do katalogu zawierającego plik, którego ścieżkę podaje użytkownik ). Dlatego nie musi mieć określonego zastosowania: dopóki spełnia normalną semantykęcd <some-path>
, jest przydatny.źródło
.
należy traktować jako poprawną ścieżkę określoną przezcd
składnię.IFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d)
. W trakcie jego działania znajdź produkuje.
jako ścieżkę, aby poleceniecd "$Dir"
rozwijało się docd .
. Tak więc w skryptach jest to całkowicie przydatne.cd ${path_to_directory}
, ale w pewnym momencie okazuje się, że katalog jest katalogiem bieżącym,path_to_directory = .
więccd .
na wszelki wypadek musiałbyś pracować.if
kontrole ielse
klauzule, wszelkiego rodzaju specjalna obudowa) nie jest potrzebny.Ścieżka do katalogu mogła ulec zmianie od czasu wykonania ostatniego polecenia, a bez
cd .
powłoki bash i ksh93 powłoki będą polegać na logicznym katalogu roboczym opisanym w poście, do którego link znajduje się w pytaniu, więc wywołanie,cd .
które powoduje problem z powłoką , wywołujegetcwd()
syscall aktualna ścieżka jest nadal aktualna.Kroki do odtworzenia w bash:
mkdir ./dir_no_1; cd ./dir_no_1
mv dir_no_1 dir_no_2
echo $PWD
ipwd
. Zauważ, że nazwa katalogu została zmieniona zewnętrznie; środowisko powłoki nie zostało zaktualizowane.cd .; pwd; echo $PWD
. Zauważ, że wartość została zaktualizowana.Jednak ksh93 nie aktualizuje informacji o środowisku, więc
cd .
w ksh93 może być w rzeczywistości bezużyteczny. W/bin/dash
systemach Ubuntu i innych systemach opartych na Debianiecd .
zwracadash: 3: cd: can't cd to .
błąd, jednakcd -P .
działa (w przeciwieństwie do ksh93).źródło
mv ../dir_no_1 ../dir_no_2
w tym samym terminalu / bash.pwd
jest w rzeczywistości wbudowany, jednak wywoływanie/bin/pwd
nie ma wpływu na środowisko powłoki - narzędzia zewnętrzne w ogóle nie wpływają na środowisko powłoki. Powodem/bin/cd
i/bin/pwd
między innymi jest zgodność z POSIX. Jest dobra dyskusja na temat zewnętrznego dysku CD z których niektóre prawdopodobnie dotyczy/bin/pwd
równieżInnym przykładem użycia
cd .
może być usunięcie katalogu, w którym aktualnie się znajdujesz, a następnie utworzenie go ponownie. Rozważ wypróbowanie następujących opcji -temp
cd temp
a następnie zróbls
temp
ls: cannot open directory .: Stale file handle
cd .
a następnie wykonanie ls działa dobrzeźródło
cd: can't cd to .
Teraz, gdy na to patrzę, jest to już wspomniane w odpowiedzi Sergiy (przenoszenie, usuwanie / odtwarzanie - zasadniczo to samo: katalog, w którym jesteś, nie jest już tym, co było w oryginale path)cd .
polecenie przejścia do nowego katalogu o tej samej nazwie.cd .
cały czas, gdy mam powłokę, której bieżący katalog roboczy został podłączony za pomocą sshfs, ale sesja ssh została zamknięta i ponownie otwarta.PWD
zmiennej środowiskowej), a następnie przejdź do hierarchii systemu plików od katalogu głównego do katalogu, który jest osiągalny przez ta ścieżka, niezależnie od tego, czy jest to faktycznie ten sam katalog, czy nie. To pasuje dokładnie do przypadku użycia w tej odpowiedzi.cd .
działa, gdy katalog został odłączony i nowy, inny katalog jest tworzony w tej samej ścieżce systemu plików. Bieżący katalog roboczy został odłączony i prawdopodobnie w ramach tego nie ma już wpisu.
lub..
, a nawet jeśli tak,.
wpis powinien nadal wskazywać na siebie. Wygląda na to, że powłoka lub jądro wykonuje polecenie cd w oparciu o nazwę ścieżki katalogu, a nie tylko dostęp do.
wpisu. Czy ktoś może potwierdzić to zachowanie?Możesz to wyczyścić
$OLDPWD
szybkocd .
, jeśli powinien istnieć przypadek, w którym nie chcesz, aby wskazywał „interesujące”. Wpłynie to równieżcd -
.źródło
Programowo jest użyteczny jako brak możliwości. Rozważ ścieżkę podaną z zewnętrznego źródła.
Dzięki ścieżce takiej jak „fred.txt” katalog stanie się
.
, prowadząc docd .
źródło
dirname
Komenda generuje.
gdzie konieczne, aby uniknąć łamanie kodu, który oczekuje, że będzie w stanie podzielić ścieżkę.Jest to powszechne, jeśli musiałeś pracować ze złym kablem USB. Po odłączeniu urządzenia i ponownym podłączeniu oraz automatycznym podłączeniu do tego samego katalogu, musisz użyć
cd .
go, aby ponownie uruchomić urządzenie.źródło
Pamiętaj, że „.” to właściwy sposób na określenie nazwy pliku, który jest otwarty jako bieżący katalog roboczy dowolnego procesu (w tym oczywiście procesu powłoki), i „.” jest zawsze prawidłową nazwą pliku we wszystkich katalogach, w tym w bieżącym katalogu roboczym. Nazwa
.
może nie być prawidłową nazwą pliku dla danej instancji procesu, jeśli powiedzmy, że bieżący katalog roboczy został usunięty (lub „źle”, np. Nieaktualny uchwyt NFS), ale jest to poprawna nazwa pliku, który na pewno istnieje w każdym prawidłowym katalogu..
Musi więc być poprawnym argumentem dla każdego polecenia, które akceptuje nazwę katalogu, a zatem w standardowej powłocecd .
musi być poprawnym poleceniem.To, czy
cd .
jest przydatne, czy nie, zależy od implementacji powłoki. Jak wspomniano, może być użyteczne, jeśli powłoka resetuje swoją wewnętrzną koncepcję pełnej nazwy ścieżki bieżącego katalogu roboczego po wywołaniu bazowegochdir
wywołania systemowego, powiedzmy na przykład, czy nazwa katalogu bazowego (lub jego rodzica) została zmieniona.Przynajmniej niektóre powłoki, które znam (
/bin/sh
na FreeBSD i NetBSD), zostaną przekonwertowanecd ""
nacd .
, co można prawdopodobnie opisać funkcję wspierającą programowe użycie w skrypcie powłoki, w którym zmienna może być użyta jako parametr (tj. Konwersja podstawienia pustej zmiennej na „ „nic nie rób”), choć historia zatwierdzeń FreeBSD mówi, że zmiana była spowodowana bezpośrednio dodaniem obsługi POSIX, aby zapobiec awariichdir("")
, której mandaty POSIX muszą zawieść.Niektóre inne powłoki zastąpią
.
wszystko, co zachowały jako w pełni kwalifikowaną ścieżkę do ich bieżącego katalogu roboczego, a zatem dla nich może to pozwolić na zachowanie wymienione w odpowiedzi Sahila Agarwal'a .źródło
Użyłem tego polecenia dopiero dzisiaj, kiedy zmieniłem gałąź, nad którą pracowałem w Git, z katalogu, który został najpierw utworzony w tej samej gałęzi. Rebase poszło dobrze, ale później
git status
zgłosił błąd. Po tymcd .
wszystkim było normalnie.(Nawiasem mówiąc, pracowałem w MobaXterm na Windowsie. Na wypadek, gdybyś próbował to odtworzyć. Może się to nie zdarzyć na innych systemach).
Użyłem również tego polecenia w katalogach, które są odświeżane przez zautomatyzowany proces, który odsuwa stary katalog i zastępuje go nowym (tak, aby był jak najbliżej atomu). Nie jest to powszechna sytuacja, ale
cd .
jest dokładnie tym, czego potrzeba.Po przeczytaniu tej doskonałej odpowiedzi Stephane Chazelas:
Teraz rozumiem, że moje powyższe przypadki użycia działają tylko dlatego, że używam
bash
, w którymcd .
jest to równoważne zcd "$PWD"
. Bardzo polecam przeczytanie połączonej odpowiedzi.źródło
Używam
cd .
do ponownego uruchomienia rzeczy, które zostały przeciążonecd
za pomocąbash
funkcji.Od mojego
~/.bashrc
:źródło
EDYCJA: Sugerowało to wcześniej Sahil .
Jest to przydatne, jeśli znajdujesz się w folderze, który został usunięty i ponownie utworzony przez inny proces. Na przykład zakładając dwie sesje terminalowe
$1
i$2
:Nie jestem pewien, czy dokładnie gdzie (OS, SHELL, ...?) Podstawową przyczyną tego zachowania jest.
źródło
Nie, to nie ma sensu. Ani w skryptach nic nie robi.
źródło
$PWD
i prawdopodobnie wywoła inne funkcje powłoki, jeśli użytkownik poda własnącd
funkcję lub alias w celu przeciążenia wbudowanegocd
. Sprawdziłby również, czy bieżący katalog jest nadal aktualny i czy bieżące użycie ma pozwolenie na bycie tam.cd .
narzeka.