Memahami direktori symlink traversal dan direktori induk

9

Katakanlah Anda memiliki direktori /dir1dan /dir2/linked, di mana yang terakhir adalah symlink ke yang sebelumnya.

Ketika Anda cdke linkeddan pwd, Anda mendapatkan output /dir2/linked. Jika Anda kemudian cd .., Anda akan dikenakan /dir2. Perilaku ini konsisten dengan konsep Anda /dir2/linkedsebelumnya. Namun, seperti yang saya pahami, direktori induk ( ..) dari direktori apa pun disimpan dalam inode direktori (yaitu: secara fisik di disk). Jelas, karena /dir2/linkedini benar-benar /dir1, direktori induk pada inode harus/

Untuk lebih memperumit masalah, sementara di dalam /dir2/linked, output ls ..dan cd .. ; ls .berbeda! Sepertinya cdmenghormati jalan yang disinkronkan, sementara lsmenghormati jalan "fisik". Seperti yang disebutkan dalam pertanyaan ini , ada cd -Puntuk kasus penggunaan ini.

man pwd menyebutkan direktori kerja "fisik" dan "logis", tetapi saya masih memiliki beberapa pertanyaan saat ini:

  • Apakah perilaku ini selalu disediakan oleh PWDvariabel lingkungan, sebagaimana disebutkan dalam man pwd?
  • Mengapa default cddan lsmemiliki perilaku yang berbeda, jika keduanya perintah shell (yaitu: bukan program)?
  • Apakah program tipikal (bukan perintah shell) digunakan PWDsebagai ganti jalur fisik? Saya menyadari ini tergantung pada implementasinya, tetapi adakah aturan mainnya?
goncalopp
sumber
1
Banyak info dalam jawaban ini
Stéphane Chazelas
1
@ StéphaneChazelas Itu jawaban yang fantastis, terima kasih sudah berbagi
goncalopp
Sama-sama. Silakan menyalin-tempel teks dari sana jika Anda berencana untuk membuat jawaban Anda sendiri untuk pertanyaan Anda sendiri.
Stéphane Chazelas

Jawaban:

5

bash "tahu" tentang symlink dan melacak info ini ketika Anda menggunakan symlink untuk masuk ke direktori.

Anda dapat memeriksa ini dengan melakukan hal berikut dalam contoh Anda:

$ cd /dir2
$ cd linked
$ pwd
/dir2/linked
$ PWD='' bash -c pwd
/dir1

Anda perlu memulai bash dengan PWDvariabel kosong , jika tidak menggunakan trik itu untuk menampilkan jalan "palsu".

Perhatikan bahwa ls adalah program yang terpisah dan dengan demikian tidak memiliki pengetahuan bash bagaimana Anda tiba di direktori saat ini, sehingga ls ..hanya akan menampilkan isi dari nyata direktori induk, tidak relatif terhadap symlink Anda mengikuti.

Sebagian besar program tidak akan bergantung pada variabel lingkungan CWDkarena ada banyak cara untuk memulai program, melalui bash shell hanya satu sehingga tidak dapat diandalkan CWDuntuk mengandung nilai yang benar (coba atur CWDke sesuatu yang salah sebelum melakukan bash -c pwd, Anda dapat melihatnya memeriksa nilai untuk kewarasan).

Wurtel
sumber
itu berguna untuk mengetahui bahwa Anda jelas PWDseperti itu, tetapi dengan sendirinya ini tidak menjawab pertanyaan yang saya sebutkan
goncalopp
Menambahkan beberapa info lagi.
Wurtel
Saya di bawah kesan lsdisediakan oleh bash, tetapi Anda dan helpmeyakinkan saya sebaliknya. Itu membuat segalanya lebih jelas, terima kasih!
goncalopp
PWDadalah standar dalam POSIX. Anda bisa mengandalkannya untuk diatur. Jika tidak disetel, hal-hal dapat rusak, misalnya pwd utilitas : Lihat juga variabel Lingkungan .
darkfeline