Pemahaman dasar saya tentang symlink adalah sebagai file khusus, file yang berisi jalur string ke file lain. Kernel VFS mengabstraksi banyak hal itu tetapi apakah ada alasan mengapa symlink tampaknya tidak dapat diedit?
Dengan kata lain: Dapatkah saya mengedit symlink? Jika tidak, mengapa tidak?
Saya mengerti bahwa ada berbagai cara untuk mengganti symlink (dua alternatif saat ini ada di bagian jawaban) tetapi akan menarik untuk mendapatkan penjelasan tentang mengapa penggantian tampaknya menjadi satu-satunya cara untuk berurusan dengan symlink. Mengapa Anda tidak bisa mengubah di mana mereka menunjuk?
filesystems
symlink
Oli
sumber
sumber
Jawaban:
Mengingat bahwa
-f
hanya melakukan penggantian diam, Anda dapat melakukan penggantian atom denganmv -T
(-T membuatnya berfungsi bahkan jika /loc.../link adalah direktori) :linkname
dapat diakses selama proses berlangsung.sumber
linkname
bukan symlink ke direktori. Gunakan-T
opsi untukmv
jika pada GNU atau-h
jika pada FreeBSD untuk menghindari itu. Perhatikan bahwa sepertiln -sf
itu tidak mempertahankan izin tautan (pada sistem di mana mereka signifikan).-n
opsi misalnya:ln -sfn DESTINATION_DIRECTORY LINK_NAME
. Baca lebih lanjut di askubuntu.com/a/186227/69004Jika dengan edit, Anda bermaksud mengubah file yang ditunjuknya, maka ya Anda bisa:
The
-f
parameter (--force
) ketika melewati ke ln menyebabkan itu untuk memanggilunlink()
system call tepat sebelumsymlink()
Diambil dari jawaban stack overflow berikut .
sumber
test
target bukan direktori. Kalau tidak,ln -s -f .profile test
akan membuat.profile
symlink di direktori itu. GNUln
memiliki-T
opsi untuk menghindarinya.Tautan simbolik perlu dimodifikasi secara atomik. Jika Anda setengah menulis, mereka tidak akan berhasil. Konten dari tautan simbolik cukup kecil (paling banyak 4.095 karakter di Linux: panjang maksimum jalur ke sebuah file), jadi akan ada sedikit gunanya dalam mengedit bagian dari tautan simbolik di tingkat kernel. Oleh karena itu kernel tidak menawarkan antarmuka apa pun untuk mengedit tautan simbolik, hanya antarmuka untuk membuat yang baru,
symlink
panggilan sistem (plus antarmuka generikunlink
untuk menghapus file apa pun).The
symlink
system call hanya menciptakan link simbolik baru, itu tidak menghapus file yang ada. Ini menjengkelkan, tetapi konsisten dengan panggilan sistem lain untuk membuat file sepertiopen
(yang dapat membuat file baru atau memotong file yang ada, tetapi tidak mengganti file yang ada dengan file yang baru dibuat) danmkdir
.Dalam shell, seperti yang Anda temukan , sementara Anda tidak dapat mengganti tautan simbol secara atomik dengan
ln
perintah (ln -sf
memutuskan tautan file sebelumnya lalu membuat tautan simbolik), Anda dapat melakukannya dengan terlebih dahulu membuat tautan simbolik di bawah nama sementara dan kemudian memindahkannya ke tempatnya.sumber
mv -f
(sukaln -sf
) tidak akan melakukan apa yang Anda inginkan jika$link
menunjuk ke direktori. GNU ln dan mv punya-T
untuk itu.mv
(rename system call) akan selalu mengubah inode$link
sementaraln -sfT
(unlink + symlink) mungkin menggunakan kembali yang sama.Secara teknis, tidak ada perintah bawaan untuk mengedit tautan simbolik yang ada. Itu dapat dengan mudah dicapai dengan beberapa perintah pendek.
Inilah sedikit fungsi bash / zsh yang saya tulis untuk memperbarui tautan simbolik yang ada:
sumber
Asumsikan linkname ada sebagai hasil dari yang telah dilakukan (di masa lalu):
Lalu, ada tiga cara untuk mengubah symlink:
Gunakan ln dengan
-f
paksa dan bahkan untuk direktori-n
(inode bisa digunakan kembali):Hapus symlink dan buat yang baru (bahkan untuk direktori):
buat symlink baru, lalu
mv
(perubahan atom bahkan untuk direktori):sumber