Sua pergunta é meio confusa.
-
Você perguntou "Existe alguma maneira que eu possa fazer um link simbólico para ele de ~/dir1 [...]?" Eu suponho que você quis dizer "de ~/dir2 ", com base no resto do seu post?
-
Seu primeiro comando
$ ln -s ./dir1/file.txt ./dir2/file.txt
não faz o que você acha que faz. Supondo que você ainda esteja em seu diretório home, o comando acima cria um link simbólico cujo próprio caminho é ~/dir2/file.txt , e este link simbólico aponta literalmente para o caminho ./dir1/file.txt . Como o referido link simbólico reside no diretório ~/dir2 , esse caminho de destino é resolvido para ~/dir2/./dir1/file.txt , o que resolve ainda mais para ~/dir2/dir1/file.txt (provavelmente inexistente e não o que você deseja). Então duvido porque você disse que resolve ~/dir1/dir2/file.txt .
-
Seu segundo comando falha porque não há diretório ../dir2 para colocar o link simbólico, e é isso que a mensagem de erro significava.
-
Para responder à sua pergunta, sim. O sistema operacional não se importa se o seu link simbólico aponta para um caminho sem nenhum objeto de sistema de arquivos válido presente.
Provavelmente o que você realmente quer é algo como
ln -s ../dir1/file.txt ./dir2/file.txt
Eu acho? Esse comando cria um link simbólico cujo próprio caminho é ./dir2/file.txt e seu destino é o caminho relativo literal ../dir1/file.txt . O caminho final e absoluto apontado pelo link simbólico é ~/dir2/../dir1/file.txt , que resolve para ~/dir1/file.txt .
Observe que o símbolo ~ é um caractere expansível do shell que é expandido para o caminho absoluto do seu diretório inicial. A ~ -expansion não faz parte da resolução do caminho do SO.
Leitura sugerida
Manpages do Linux de path_resolution(7) , symlink(7) , ln(1) e ln(1p) .
Editar
Esclarecimentos e amp; leitura sugerida.