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/?

Val
źródło

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”.

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

Alternatywnym sposobem jest uruchomienie:

cd $(/bin/pwd)/..
jlliagre
źródło
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).

dodgethesteamroller
źródło
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