Apakah target symlink relatif terhadap direktori induk tujuan dan jika demikian, mengapa?

14

Saya punya struktur file berikut:

build/
client/
  –> index.js

Dan ketika saya mencoba membuat tautan simbolis bernama "klien" di dalam direktori build yang merujuk ke direktori klien di cwd seperti itu

// Fails
$ pwd
/home/user/
$ ln -s client build/client 
$ stat build/client/index.js
stat: build/client/index.js: stat: Too many levels of symbolic links

Saya mendapatkan kesalahan ELOOP yang ditampilkan di atas. Ketika saya mengubah jalur target menjadi relatif ke jalur tujuan, semuanya baik:

// Works
$ pwd
/home/user/
$ ln -s ../client build/client 
$ stat build/client/index.js
stat: <outputs file stats>

Apakah ini perilaku yang dimaksudkan dan tolong jelaskan mengapa ...

jibsales
sumber
ini mungkin ada hubungannya dengan efek yang menggunakan ../ gunakan path absolut untuk mendeklarasikan path daripada path relatif. praktik yang baik adalah selalu menggunakan jalur absolut
Kiwy
Saya setuju dengan praktik terbaik karena saya selalu menggunakan jalur absolut untuk target dan tujuan. Namun, halaman manual menyatakan bahwa jalur relatif dapat digunakan untuk keduanya ...
jibsales

Jawaban:

13

Untuk yang tidak berfungsi, jika kita melihat ls -lhasilnya, kita mendapatkan yang berikut:

[sparticvs@sparta test]$ ls -l build/
total 0
lrwxrwxrwx. 1 sparticvs sparticvs 6 Dec 17 16:08 client -> client

Sekarang untuk mengerti apa yang sedang terjadi di sini. Mari kita lihat perintah yang Anda panggil:

ln -s client build/client

Menurut Man Page, ada dua kemungkinan kecocokan untuk format ini

SYNOPSIS
       ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
       ln [OPTION]... TARGET... DIRECTORY     (3rd form)

Ini akan cocok pada formulir pertama (sejak yang pertama). Sekarang, "nama target" atau clientdalam kasus Anda, dapat (menurut lnmanual lengkap ) string acak. Mereka tidak harus memutuskan untuk apa pun sekarang, tetapi dapat menyelesaikan sesuatu di masa depan. Apa yang Anda buat dengan permintaan Anda adalah "tautan terjuntai" dan sistem tidak membuat Anda tidak membuatnya.

Sekarang doa kedua Anda ln -s ../client build/clientadalah apa yang disebut "symlink relatif" (seperti yang Anda catat dalam posting Anda sendiri). Ada tipe kedua dan itu adalah "symlink absolut" yang akan dipanggil dengan melakukan ln -s /home/user/client build/client.

Ini bukan bug. Menurut manual itu menyatakan:

Saat membuat symlink relatif di lokasi yang berbeda dari direktori saat ini, resolusi symlink akan berbeda dari resolusi string yang sama dari direktori saat ini. Oleh karena itu, banyak pengguna lebih suka untuk terlebih dahulu mengubah direktori ke lokasi di mana symlink relatif akan dibuat, sehingga penyelesaian-tab atau resolusi file lainnya akan menemukan target yang sama dengan apa yang akan ditempatkan di symlink.

- dari info coreutils 'ln invocation'

Karena itu, Anda HARUS menggunakan jalur relatif atau absolut ke target.

sparticvs
sumber
5

Ini memang perilaku yang dimaksud. Dari ln(1)halaman manual:

Tautan simbolik dapat menampung teks sewenang-wenang; jika nanti diselesaikan, tautan relatif ditafsirkan terkait dengan direktori induknya.

Mengenai alasannya, bayangkan jika symlink bukannya ditafsirkan relatif terhadap sumbernya daripada tujuannya. Ketika nanti menyelesaikannya, Anda harus tahu apa CWD Anda saat Anda membuatnya, yang tidak masuk akal, apalagi mustahil.

Selain itu, dengan cara ini Anda mendapatkan metode yang rapi dan kompak untuk membuat struktur direktori kerangka yang bisa Anda jatuhkan di mana saja di pohon direktori tanpa memutus symlink.

Untuk memberi Anda contoh tentang apa yang saya maksud, katakanlah Anda sedang mengerjakan sebuah proyek dan Anda memiliki seluruh struktur direktori yang diatur untuk itu seperti:

$ ls -1 /home/you/project
thingummies/
widgets/
wizardry/

Sekarang anggaplah Anda ingin membuat symlink ke widgets/dalam wizardry/. Anda memiliki dua opsi:

$ ln -s /home/you/project/widgets /home/you/project/wizardry

atau

$ ln -s ../widgets /home/you/project/wizardry

Jika Anda kemudian mencoba pindah ke /home/you/projecttempat lain, symlink yang dibuat dengan bentuk pertama akan rusak karena sedang dicari /home/you/project/widgets. Bentuk kedua akan menjaga symlink berfungsi karena mencari ../widgets relatif ke tempat di mana, di mana pun tempat itu berada di pohon direktori.

Joseph R.
sumber