Jak wprowadzić katalog, którego nazwa jest tylko minusem?

26

Pobrałem lessn do mojego serwera WWW i rozpięła go.

Zawiera folder o nazwie -. Zakładałem, że wiem, jak sobie z tym poradzić, ale nie wiem.

Próbowałem cd -- -, ale to nie przynosi pożądanego efektu. Wydaje się, że stosowanie cytatów również na to nie wpływa. Wszędzie położyłem cięcia, bezskutecznie.

Jaki jest właściwy sposób przejścia do tego folderu?

Der Hochstapler
źródło

Odpowiedzi:

34

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 bashlub man cd), cdma inną interpretację, która postrzega -jako parametr (patrz man bashlub man cd).

Należy również zauważyć, że cdjest to funkcja wbudowana w powłokę, co można przeczytać w tej odpowiedzi :

cdnie 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 cdpolecenie 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 whichi 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 whichwięcej informacji, a man bashczy man typedlatype

Tamara Wijsman
źródło
4
Nie, „-” jest zaimplementowane we wszystkich standardowych narzędziach, ale ma na celu zakończenie opcji. Sam „-” nie jest rozpoznawany jako opcja, ale jako poprzedni katalog.
Stéphane Chazelas
4
Prawidłowe rozwiązanie, ale wyjaśnienie jest błędne. Wbudowane jest całkowicie nieistotne cd. Powód cd -- -nie działa, ponieważ -jest operandem, a nie opcją.
Gilles „SO- przestań być zły”
1
w systemie Mac OS X cd -- -zmieni się na katalog o nazwie -w bieżącym katalogu. FWIW.
Tim Kennedy
Większość komentarzy znalazła odzwierciedlenie w drugiej części mojego postu.
Tamara Wijsman
22

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 operandem cd -i nadal operandem w cd -- -. Podobnie jak inne standardowe narzędzia, cdtraktuje operand jak operand, niezależnie od tego, czy jest --przed nim.

cdKomenda przypisuje szczególne znaczenie dla argumentu -. Wszystko inne to katalog, do którego można się przełączyć. cd -- -aprzechodzi do katalogu o nazwie -a, ponieważ -anie jest specjalny jako operand i --zapobiega cdtraktowaniu 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: CDPATHnie jest konsultowany, kiedy rozpoczyna się nazwa katalogu /, ./lub ../. A zatem:

cd ./-

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:

cd -- -/

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 przypadku cd -/(zsh robi).

Gilles „SO- przestań być zły”
źródło
To mnie zaskakuje, tak naprawdę próbowałem cd -- -/, ale ponieważ wcześniej uruchomiłem odpowiednik cd -tego katalogu, katalog tak naprawdę nie istniał i zinterpretowałem go jako kolejną nieudaną próbę.
Der Hochstapler
5

Kwalifikacja za pomocą ścieżki jest jedną z opcji.

cd ./-
iruvar
źródło
2

Te działałyby również:

cd ~/'-'

lub

cd ~/"-"
Michael Durrant
źródło
1
ale tylko jeśli dzieje się tak w katalogu domowym
RiaD
1
… A cytaty są niepotrzebne.
Scott