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
sumber
Jawaban:
cd
built bash melakukan sedikit sihir dengan..
.Saat kamu melakukan:
Itu terlihat
$PWD
, menghapus komponen terakhir, menambahkan komponen Bsym. Ini adalah apacd
dan apa yangcd -L
harus dilakukancd -P
. Juga lihatpwd -L
danpwd -P
.Saat kamu melakukan:
Keajaiban ini tidak terjadi.
$PWD
tidak digunakan,/proc/self/cwd
malah digunakan. Cwd adalah sebuah inode, dan .. hanya inode induk, yang merupakan kebetulan/tmp
.sumber