Chcesz, aby parametr nie był parametrem, dlatego staramy się coś do tego dodać. Dostęp do bieżącego katalogu można uzyskać za pomocą .
, dzięki czemu -
można uzyskać dostęp do podfoldera na przemian za pomocą ./-
.
cd ./-
Powodem, dla którego cd -- -
to nie działa, jest to, że jest to realizowane inaczej, jeśli porównasz rm
(zobacz man rm
) do cd
(zobacz man bash
lub man cd
), cd
ma inną interpretację, która postrzega -
jako parametr (patrz man bash
lub man cd
).
Należy również zauważyć, że cd
jest to funkcja wbudowana w powłokę, co można przeczytać w tej odpowiedzi :
cd
nie jest poleceniem zewnętrznym - jest to wbudowana funkcja powłoki. Działa w kontekście bieżącej powłoki, a nie, jak to robią polecenia zewnętrzne, w kontekście rozwidlenia / wykonania jako osobny proces.
Istnieje cd
polecenie zewnętrzne , ale robi coś zupełnie innego .
To wyjaśnia, dlaczego implementacja jest inna, ponieważ Bash i Coreutils to dwie różne rzeczy.
Załóżmy, że nie uwierzysz w to, jak to potwierdzimy? Użyj which
i type
.
$ which cd && type cd
which: no cd in (/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.7.2:/usr/games/bin
cd is a shell builtin
$ which rm && type rm
/bin/rm
/bin/rm is /bin/rm
Zobacz man which
więcej informacji, a man bash
czy man type
dlatype
cd
. Powódcd -- -
nie działa, ponieważ-
jest operandem, a nie opcją.cd -- -
zmieni się na katalog o nazwie-
w bieżącym katalogu. FWIW.Sam minus (aka myślnik) nie jest opcją, ale operandem (tzn. Argumentem, który nie jest opcją). Z tego powodu stawianie
--
przed nim nie ma żadnego efektu. Myślnik jest operandemcd -
i nadal operandem wcd -- -
. Podobnie jak inne standardowe narzędzia,cd
traktuje operand jak operand, niezależnie od tego, czy jest--
przed nim.cd
Komenda przypisuje szczególne znaczenie dla argumentu-
. Wszystko inne to katalog, do którego można się przełączyć.cd -- -a
przechodzi do katalogu o nazwie-a
, ponieważ-a
nie jest specjalny jako operand i--
zapobiegacd
traktowaniu go jako opcji. To nie działa w-
pojedynkę, co nie jest opcją.Umieszczanie cudzysłowów
-
nie pomoże, ponieważ i tak ostatecznie przejdzie operand-
.Dlatego jedynym wyjściem jest znalezienie innego sposobu wyrażenia tego samego pomysłu, tj. Innej nazwy dla tego samego katalogu. Na szczęście jest prosty: jeśli dodasz
./
przed względną nazwą pliku, nadal oznacza to ten sam plik../
Robi różnicę, która nie ma znaczenia w naszym przypadku:CDPATH
nie jest konsultowany, kiedy rozpoczyna się nazwa katalogu/
,./
lub../
. A zatem:Innym sposobem, ponieważ
-
jest katalogiem, jest dodanie/
po nim. Dodanie/
na końcu nazwy pliku gwarantuje, że plik jest traktowany jako katalog (w szczególności polecenie będzie działać na samym katalogu, a nie na dowiązaniu symbolicznym, jeśli plik jest dowiązaniem symbolicznym do katalogu), ale w inny sposób powoduje bez różnicy. A zatem:Nawiasem
-/
mówiąc, pisanie jest sugerowane przez kod zakończenia, ale w bash tak naprawdę działa tylko--
przed nim, bash nie ma specjalnego przypadkucd -/
(zsh robi).źródło
cd -- -/
, ale ponieważ wcześniej uruchomiłem odpowiednikcd -
tego katalogu, katalog tak naprawdę nie istniał i zinterpretowałem go jako kolejną nieudaną próbę.Kwalifikacja za pomocą ścieżki jest jedną z opcji.
źródło
Te działałyby również:
lub
źródło