Apakah tautan simbolis Linux saya berfungsi dengan benar?

2

Saya telah menggunakan dan menonaktifkan Linux selama 15 tahun terakhir dan hari ini saya menemukan sesuatu dalam bash yang mengejutkan saya.

Atur struktur direktori berikut:

$ cd /tmp
$ mkdir /tmp/symlinktest
$ mkdir /tmp/symlinktest/dir
$ mkdir /tmp/symlinktarget

Sekarang buat dua tautan sym di symlinktest yang menunjuk ke symlinktarget:

$ cd /tmp/symlinktest
$ ln -s ../symlinktarget Asym
$ ln -s ../symlinktarget Bsym

Sekarang, dalam bash, penyelesaian tab berikut melakukan hal-hal aneh. Ketikkan yang berikut ini:

$ cd dir
$ cd ../A[TAB]

Menekan tombol tab di atas melengkapi garis untuk:

$ cd ../Asym/

seperti yang kuharapkan. Sekarang tekan enter untuk berubah menjadi Asym dan ketik:

$ cd ../B[TAB]

Kali ini dengan menekan tombol tab melengkapi tautan ke:

$ cd ../Bsym[space]

Perhatikan bahwa sekarang ada spasi setelah Bsym dan tidak ada garis miring.

Pertanyaan saya adalah, mengapa ketika mengubah dari direktori fisik "dir" ke Asym itu mengakui bahwa Asym adalah tautan ke direktori, tetapi ketika mengubah dari satu tautan sym ke yang lain, ia tidak mengenali bahwa itu adalah tautan ke direktori?

Selain itu, jika saya mencoba membuat file baru dalam Asym, saya mendapatkan pesan kesalahan:

$ cd /tmp/symlinktest/Asym
$ cat hello > ../Bsym/file.txt
-bash: ../Bsym/file.txt: No such file or directory

Saya selalu berpikir bahwa symlinks sebagian besar transparan kecuali untuk program yang perlu memanipulasi mereka. Apakah ini perilaku normal?

Terimakasih banyak,

Andy

Andy Castles
sumber
1
shell scripting masih pemrograman; pertanyaannya tidak mendekati deskripsi ini dari dialog "pilih untuk menutup": "Pertanyaan ini terkait dengan perangkat keras komputer atau perangkat lunak komputer secara umum"

Jawaban:

2

cdbuilt bash melakukan sedikit sihir dengan ...

Saat kamu melakukan:

cd ../Bsym

Itu terlihat $PWD, menghapus komponen terakhir, menambahkan komponen Bsym. Ini adalah apa cddan apa yang cd -Lharus dilakukan cd -P. Juga lihat pwd -Ldan pwd -P.

Saat kamu melakukan:

cat hello > ../Bsym/file.txt

Keajaiban ini tidak terjadi. $PWDtidak digunakan, /proc/self/cwdmalah digunakan. Cwd adalah sebuah inode, dan .. hanya inode induk, yang merupakan kebetulan /tmp.

Tobu
sumber
Terima kasih, itu masuk akal sekarang, selalu ada lagi yang bisa Anda pelajari! Saya harus lebih berhati-hati sekarang menggunakan .. dalam direktori yang terhubung secara simbolis. Saya selalu berasumsi bahwa mereka bekerja seperti direktori normal, tetapi jelas tidak. Saya agak curiga ada sesuatu tentang .. tidak tahu apakah itu harus menjadi induk dari tautan atau induk dari direktori tertaut tetapi Anda telah membuatnya jelas. Terima kasih banyak atas jawaban cepatnya.
Andy Castles