Różnica między „cd -” a „cd ~ -”


56

Polecenie Bash

cd - 

drukuje poprzednio używany katalog i wprowadza do niego zmiany.

Z drugiej strony polecenie Bash

cd ~-

bezpośrednio przechodzi do poprzednio używanego katalogu, bez echa czegokolwiek.

Czy to jedyna różnica? Jaki jest przypadek użycia każdego z poleceń?


3
Zalecam, abyś nie używał żadnej z tych podstępnych rzeczy. To jest twój mózg cd ~-.
DepressedDaniel

10
@DepressedDaniel, nawet jeśli nie planujesz używać podstępnych rzeczy, nadal warto zrozumieć, co dzieje się za kulisami - zrozumienie przypadków narożnych może wydostać się z dziury później przy próbie debugowania czegoś innego.
anotherdave

Odpowiedzi:


81

Grają tutaj dwie rzeczy. Po pierwsze, -sam zostaje rozszerzony do poprzedniego katalogu. Wyjaśnia to cdsekcja man bash(moje podkreślenie):

Argument parametru -jest konwertowany na $ OLDPWD przed próbą zmiany katalogu. Jeśli zostanie użyta niepusta nazwa katalogu z CDPATH lub jeśli -jest to pierwszy argument, a zmiana katalogu zakończy się powodzeniem, bezwzględna nazwa ścieżki nowego katalogu roboczego zostanie zapisana na standardowe wyjście. Zwracana wartość jest prawdą, jeśli katalog został pomyślnie zmieniony; fałsz inaczej.

Tak więc prosty cd -przeniesie Cię z powrotem do poprzedniego katalogu i wydrukuje nazwę katalogu. Drugie polecenie jest udokumentowane w sekcji „Rozbudowa tyldy”:

Jeśli przedrostkiem tyldy jest a ~+, wartość zmiennej powłoki PWD zastępuje przedrostek tyldy. Jeśli przedrostkiem tyldy jest a ~-, wartość zmiennej powłoki OLDPWD, jeśli jest ustawiona, jest podstawiana. Jeśli znaki następujące po tyldie w prefiksie tyldy składają się z liczby N, opcjonalnie poprzedzonej przez a +lub a -, prefiks tyldy jest zastępowany odpowiednim elementem ze stosu katalogów, tak jak by to było wyświetlane przez wbudowane katalogi wywoływane z przedrostek tyldy jako argument. Jeżeli znaki następujące po tyldie w prefiksie tyldy składają się z liczby bez znaku wiodącego +lub -, +przyjmuje się, że.

Można to łatwiej zrozumieć na przykładzie:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

Ogólnie -oznacza to „poprzedni katalog”. Właśnie dlatego cd -sam przeniesie Cię z powrotem do miejsca, w którym byłeś.

Główna różnica polega na tym, że cd -jest specyficzna dla cdwbudowanego. Jeśli spróbujesz, po echo -prostu wydrukuje -. ~-Jest częścią funkcji rozprężania tyldy i zachowuje się podobnie do zmiennej. Dlatego możesz echo ~-zdobyć coś sensownego. Możesz także użyć go w, cd ~-ale równie dobrze możesz użyć go w dowolnym innym poleceniu. Na przykład cp ~-/* .co byłoby równoważne zcp "$OLDPWD"/* .


1
set -xaby wydrukować rozszerzone polecenie przed jego wykonaniem, przydatne może być zilustrowanie różnicy (lub może być po prostu niesłyszalnie głośne, gdy nie robisz tego samemu krok po kroku).
Peter Cordes,

1
@terdon dzisiaj się nauczyłem.
sitilge

W skrócie ... cd ~-/..działa, cd -/..nie działa!
Ray Foss

13

~-podlega rozszerzeniu tyldy (patrz man bash), więc to, co cdwidzi, to bezpośrednio nazwa poprzedniego katalogu. -nie jest rozszerzany przez powłokę, cdwidzi ją bezpośrednio i zachowuje się jak udokumentowano:

Argument - jest równoważny $ OLDPWD. Jeśli zostanie użyta niepusta nazwa katalogu z CDPATH lub jeśli - jest pierwszym argumentem, a zmiana katalogu zakończy się powodzeniem, bezwzględna nazwa ścieżki nowego katalogu roboczego zostanie zapisana na standardowym wyjściu.


4

TL; DR: cd -jest wbudowane cd, ~-jest późniejszym rozszerzeniem ~[name], nie jest specyficzne dla cd.

POSIX.1-2008 Shell & Utilities definiuje cd -jako specjalny przypadek specyficzny dla cdpolecenia :

Gdy -jako argument jest używany a, będzie to równoznaczne z poleceniem:

cd "$OLDPWD" && pwd

który zmienia poprzedni katalog roboczy, a następnie zapisuje jego nazwę.

~-Rozszerzenie zostanie rozszerzona $OLDPWDzanim polecenie zostanie wykonane i mogą być przekazywane jako argument dla każdego polecenia, nie tylko cd. Jest to późniejsze rozszerzenie w i .

Wyżej wspomniany standard POSIX.1-2008 Shell & Utilities zawiera także szczegółowe wyjaśnienie rozszerzenia Tilde . Sformułowanie jest bardzo specyficzne, aby umożliwić ~-zachowanie jako nieokreślone w zakresie standardu, gdzie ~[name]odnosi się do tego, $HOMEczy [name]pusty ciąg znaków lub do katalogu domowego użytkownika, namejeśli namejest prawidłową nazwą użytkownika.

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.