Utworzyłem tę strukturę plików:
test/src
test/firefox
Po uruchomieniu tego polecenia:
ln -s test/src test/firefox
Oczekiwałbym, że test/firefox/src
zostanie utworzony link symboliczny wskazujący na test/src
, jednak zamiast tego pojawia się ten błąd:
-bash: cd: src: Too many levels of symbolic links
- Co ja robię źle?
- Czy nie możesz utworzyć dowiązania symbolicznego do jednego folderu przechowywanego w jego rodzeństwie?
- Jaki jest tego sens?
linux
filesystems
ln
David Zorychta
źródło
źródło
ls -ld test test/*
lub dokładną sekwencję poleceń uruchomionych w celu utworzenia tych plików.cd test/firefox/src
pokazywałby błądcd: no such file or directory: test/firefox/src
, ponieważtest/firefox/src
jest wiszącym dowiązaniem symbolicznym. Czy używaszcd
innego symbolicznego łącza o nazwiesrc
?ln -s
a tymcd
, o czym nam nie mówisz. Zakładając, żetest
w bieżącym katalogu znajduje się tylko podkatalog, acd src
(lub cokolwiek co wykonałeś) powinno zgłosić błąd. Włożyłeś cośtest/firefox
?/some/path
, aln -s test/src test/firefox
utworzy dowiązanie symboliczne wskazujące od/some/path/test/firefox/src
do/some/path/test/firefox/test/src
, a nie do/some/path/test/src
.Odpowiedzi:
Na pierwszy rzut oka to, co zasugerowałeś, działa dla mnie.
Przykład
Utwórz symboliczny link:
Uruchomienie go po raz drugi zwykle powoduje:
Więc prawdopodobnie dzieje się tutaj coś innego. Podejrzewam, że masz okrągłe odniesienie, w którym link wskazuje na siebie.
Możesz użyć,
find
aby nieco to wyłudzić:źródło
find -L ./ -mindepth 15
ujawnił winowajcęJak zauważa Dubu w komentarzu, problem leży w twoich względnych ścieżkach. Miałem podobny problem z symlinkowaniem mojej konfiguracji nginx od
/usr/local/etc/nginx
do/etc/nginx
. Jeśli utworzysz swoje dowiązanie symboliczne w ten sposób:W rzeczywistości utworzysz link / etc / nginx -> / etc / nginx, ponieważ ścieżka źródłowa jest względna do ścieżki łącza. Rozwiązanie jest tak proste, jak użycie ścieżek bezwzględnych:
źródło
cygwin
. Dzięki!cd
jeśli chcesz przejść do katalogu docelowego z katalogu, w którym znajduje się plik dowiązania symbolicznego.Dowiązania symboliczne odnoszą się do katalogu nadrzędnego łącza, a nie do bieżącego katalogu
ln
procesu.Kiedy to zrobisz:
(gdzie
test/firefox
jest katalog), tworzysztest/firefox/src
dowiązanie symboliczne, którego celem jesttest/src
.Jest
test/src
to względne w stosunku dotest/firefox
katalogu, więc jest to dowiązanie symboliczne do/top/dir/test/firefox/test/src
.Jeśli chcesz, aby to dowiązanie symboliczne było linkiem do
/top/dir/test/src
, musisz napisać:Lub
chociaż generalnie złym pomysłem jest tworzenie dowiązań symbolicznych do ścieżek bezwzględnych, ponieważ można je łatwo zepsuć, gdy katalogi zostaną przemianowane lub systemy plików zostaną zamontowane gdzie indziej.
Dzięki GNU
ln
możesz użyć jego-r
opcji, aby sam wykonał obliczenia:źródło
Użyj ścieżki bezwzględnej zamiast ścieżki względnej, a wtedy zadziała.
Na przykład:
źródło
Odpowiedzią jest użycie ścieżki bezwzględnej. Ale może być denerwujące, aby wpisać pełną ścieżkę do czegoś, co znajduje się w bieżącym katalogu. Możesz tego użyć, zastępując polecenia pwd. Jeśli twój cel znajduje się w bieżącym katalogu:
Jeśli Twój link powinien znajdować się w bieżącym katalogu:
źródło