Przywróć funkcjonalność „cd ..” po kliknięciu dowiązania symbolicznego


13

Jeśli utworzę dowiązanie symboliczne w terminalu za pomocą polecenia podobnego do

ln -s /path/to/some/directory symbolicLink

a następnie kliknij link za pomocą

cd symbolicLink

terminal wydaje się myśleć, że cwd jest ~/symbolicLink/mimo tego, że faktycznie pokazuje ~/path/to/some/directory/(zakładając, że łącze zostało utworzone ~, oczywiście). Oznacza to, że jeśli następnie napiszę, zabiorę cd ..mnie z powrotem ~, ponieważ terminal „myśli”, że jest to rodzic cwd.

Co musiałbym zmienić, aby cd ..zamiast tego zabrać mnie ~/path/to/some/, tj. Prawdziwego rodzica ~/path/to/some/directory/?

Odpowiedzi:



5

W zachowaniu występuje subtelne zastrzeżenie cd -P(opublikowane jako odpowiedź ze względu na długość):

$ dir1=$(mktemp --directory)
$ dir2=$(mktemp --directory)
$ ln -s -- "$dir1" /tmp/start
$ ln -s -- "$dir2" "$dir1"
$ cd "/tmp/start/"*
$ cd -P ..

Co należy pwdteraz wydrukować? Logicznie rzecz biorąc, może tak być

  1. $dir1, jeśli cd -P ..robi to cd ..najpierw i cd -- "$(readlink -f)"później, lub
  2. /tmpJeśli cd -P ..nie cd -- "$(readlink -f)"pierwszy i cd ..potem.

W rzeczywistości robi to drugie, co oznacza, że pwdintuicyjnie jest o dwa poziomy wyżej niż katalog „nadrzędny”.


1
Dzięki! cd -Pnadal rozwiązuje problem, z którym miałem do czynienia, ale nadal warto o tym wiedzieć.
Val


2

Czuję twój ból - uważam, bashże z powodu tego zachowania jestem zasadniczo złamany do użytku interaktywnego.

tcshjest znacznie bardziej przyjazną dla użytkownika powłoką do interaktywnego użytku. Pozostaw bashdo programowania (jeśli nalegasz na pisanie skryptów powłoki, gdy istnieje wiele lepszych alternatyw wśród wielu języków skryptowych).

Aby zmienić powłoki dla dowolnego użytkownika, wpisz chshw wierszu polecenia i postępuj zgodnie z instrukcjami (ponownie polecam /bin/tcshi doskonałą książkę O'Reilly Korzystanie z csh i tcsh , dostępną prawie za darmo).


Odkąd napisałem tę odpowiedź, nauczyłem się przestać się martwić i pokochać Basha za interaktywne użytkowanie. Ale nadal nie mogę sobie poradzić z domyślnym cdzachowaniem dla dowiązań symbolicznych. Muszę pamiętać, aby włożyć set -o physicalmoją .bashrclub .bash_profilekażdą maszynę, z której korzystam.
dodgethesteamroller
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.