Apakah `~ / Dokumen` adalah relatif atau jalur absolut?

37

Ini hanyalah pertanyaan kosa kata, tetapi yang terus berputar di kepala saya.

Itu berasal dari ujian praktek dari buku persiapan LPIC . Jawaban yang benar menurut buku ini ~/Documentsadalah direktori relatif karena relatif terhadap direktori home.

Namun, buku ini berisi rasio kesalahan penulisan dan kesalahan yang terhormat sehingga saya tidak bisa menerima begitu saja semua yang ditulis di sana. Di sini saya tidak setuju karena bagi saya ~bertindak sebagai variabel yang diperluas oleh shell menjadi konten $HOMEvariabel atau jalur direktori home user saat ini (lih. man bash), Jadi path sebenarnya adalah /home/myuser/Documentsyang memang merupakan direktori absolut.

Bahkan Wikipedia , untuk sekali ini, tampaknya tidak membantu saya mengenai topik ini (bahkan jika tampaknya mengkonfirmasi bahwa buku ini salah dalam hal ini):

Path absolut atau penuh menunjuk ke lokasi yang sama dalam sistem file terlepas dari direktori kerja saat ini. Untuk melakukan itu, itu harus berisi direktori root.

Sebaliknya, path relatif dimulai dari beberapa direktori yang diberikan, menghindari kebutuhan untuk menyediakan path absolut penuh.

Di sini sekali lagi, saya tidak setuju: menurut definisi ini, jalur /opt/kde3/bin/../libyang tidak bergantung pada direktori kerja saat ini haruslah yang absolut, namun pemahaman saya saat ini cocok dengan penulis buku yang membuat jalur ini relatif.

Pencarian web cepat hanya menambah frustrasi saya, menurut Kamus Webster :

path absolut - Jalur relatif ke direktori root. Karakter pertamanya harus menjadi pemisah pathname.

Jadi $HOME/Documents, atau bahkan $HOMEtidak akan dianggap direktori absolut? Atau apakah definisi ini menyiratkan ekspansi variabel? Bagaimana dengan ~karakter shell ? Apakah ada definisi relatif relatif terhadap direktori absolut yang dapat saya temukan di suatu tempat dan apakah saya salah?

WhiteWinterWolf
sumber
7
Semua path relatif, beberapa hanya relatif terhadap direktori root /, dan yang kita sebut absolut. Dengan demikian segala apa yang dimulai dari /saya sebut mutlak (bahkan jika ini adalah /usr/../etc) dan segala sesuatu yang lain yang saya sebut relatif ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Intinya adalah bahwa absolut harus berfungsi terlepas dari direktori kerja saat ini atau pengguna saat ini. Relatif hanya dapat bekerja dalam beberapa kasus sempit tertentu.
jimmij
6
Jalur dapat diperluas ke lokasi yang berbeda tergantung pada siapa pengguna. Karena itu, menurut saya, ini masih jalur absolut, bukan jalur relatif. Meskipun saya tidak berpikir definisi jalur absolut dan relatif didefinisikan dengan tepat. Ini bukan matematika. Pertanyaan ini tidak benar-benar menguji pemahaman, imo, dan tidak ada gunanya.
Faheem Mitha
1
@FaheemMitha: LPIC adalah sertifikasi Linux netral distribusi. Sertifikasi itu sendiri tampaknya baik-baik saja, tetapi ini masih jauh dari kasus tentang (setidaknya beberapa) buku yang dijual untuk mempersiapkan ujian ini sebagai pembelajaran mandiri ...
WhiteWinterWolf
2
@jimmij: "relatif" memiliki arti teknis tertentu dalam konteks jalur, dan menggunakan arti bahasa Inggris yang berbeda dari kata itu adalah praktik yang buruk. Saya benar-benar tidak setuju dengan memanggil ~/foojalur relatif. Apa yang Anda maksudkan adalah perbedaan antara hard-coding dan parameterisasi. Lihat jawaban saya untuk lebih jelasnya.
Peter Cordes
1
Definisi Kamus Webster benar, tetapi sangat membingungkan. Namun, ini menyiratkan bahwa string seperti ~/Documentsdan $HOME/Documentsbukan jalur. Mereka mengidentifikasi jalur (absolut) setelah ekspansi, tetapi mereka bukan jalur itu sendiri. Saya pikir itu setuju dengan berapa banyak pengguna Unix / Linux menggunakan istilah ini, tetapi tidak diragukan lagi string itu juga disebut jalur itu sendiri.
reinierpost

Jawaban:

41

Jika penulis mencoba untuk menangkap Anda dengan berbicara tentang string literal (tanpa ekspansi shell) sebagai jalur, maka itu adalah jalur relatif ( mkdir -p './~/Documents'). Jika tidak:


Ini merupakan jalur absolut , karena menyelesaikannya tidak bergantung pada direktori kerja proses saat ini. Jalur relatif selalu berarti relatif terhadap direktori kerja proses. Atau dalam hal target symlink, relatif terhadap lokasi symlink. ( gcc -> gcc-5.2vs. gcc -> /usr/bin/gcc-5.2). Ini penting untuk NFS-mounts dan case lain di mana Anda bisa mendapatkan symlink yang sama melalui jalur absolut yang berbeda. misalnya

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian kadang-kadang akan menginstal symlink ../../doc/whatever/whatever, bukan target symlink absolut, sehingga berfungsi ketika NFS dipasang di tempat lain, atau ketika melihat chroot tanpa chroot(8)memasukkannya.

Setiap proses Unix memiliki cwd sendiri. The pwdperintah ada hanya untuk mencetaknya.

lihat: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html untuk informasi lebih lanjut tentang mengubah direktori dengan panggilan sistem POSIX.


Seperti yang orang lain katakan, ~diperluas oleh shell sebelum path digunakan untuk apa pun. Menggunakan ~/bin/myprogskrip shell akan membuatnya berfungsi berbeda untuk pengguna yang berbeda. Perbedaan antara ~/bin/foodan /home/peter/bin/fooadalah bahwa salah satu dari mereka telah mengkodekan lokasi secara sulit, sedangkan yang lain telah membuat parameternya. Ini merupakan kesalahan (IMO) untuk menyebut ~versi sebagai jalur relatif.

Membicarakan hal-hal yang "relatif terhadap variabel lingkungan" hanya membingungkan. Merupakan praktik yang buruk untuk menggunakan arti istilah bahasa Inggris yang berbeda yang memiliki arti teknis tertentu dalam konteks Anda menggunakannya.

Pada sistem yang rusak, dengan HOME=a/relative/path, ~/fooakan berkembang ke jalur relatif. Ini sama sekali bukan pengaturan yang bisa digunakan.

Peter Cordes
sumber
3
Terima kasih atas jawaban ini, sepertinya itu yang paling komprehensif bagi saya. Saya juga memiliki kesan bahwa penulis salah menggabungkan gagasan tentang jalur kanonik ke dalam hal ini (yang tidak disebutkan oleh penulis di mana pun). /opt/kde3/bin/../libmisalnya diklasifikasikan secara salah sebagai jalur relatif: itu adalah jalur absolut tetapi bukan jalur kanonik. Seperti yang Anda katakan, ini hanya membuat segalanya membingungkan, jadi terima kasih atas klarifikasi Anda dan info yang terkait dengan NFS :)!
WhiteWinterWolf
1
Saya harus menyimpulkan bahwa menulis buku persiapan ujian tidak terlalu menyenangkan, dan bahwa orang yang hanya menggunakan Unix atau GNU / Linux untuk komputasi sehari-hari mereka bukan orang yang menulis buku-buku itu. Contoh dari panggilan relatif non-kanonik relatif tampaknya sangat buruk dan jelas bagi saya. man7.org/linux/man-pages/man3/realpath.3.html (dan realpath(1)) melakukan keduanya: mengkanoniskan dan membuat absolut (serta mengikuti symlink), sehingga mungkin beberapa kebingungan merayap di sana.
Peter Cordes
2
Namun, itu hanya konsep sehari-hari biasa bagi saya. Saya pikir itu akan aneh untuk memiliki selembar kertas yang mengatakan saya tahu mereka ... Tapi semoga beruntung mendapatkan selembar kertas Anda, @WhiteWinterWolf, untuk menunjukkan kepada semua orang yang suka melihat potongan kertas. :)
Peter Cordes
48

Ini pada dasarnya adalah pertanyaan tentang definisi istilah. Jadi untuk tujuan Anda, jawabannya adalah apa pun yang diinginkan LPIC. Tapi kita bisa sampai pada beberapa kesimpulan berdasarkan fakta teknis:

Jika Anda beralih '~/Documents'ke panggilan sistem , itu akan mencari direktori bernama persis ~di direktori saat ini (dan mungkin gagal). Jadi, dengan gagasan tentang nama path yang digunakan oleh kernel , ini adalah jalur relatif - tetapi bukan itu yang kami maksudkan.

~adalah sintaks yang diimplementasikan oleh shell (dan program lain yang menirunya untuk kenyamanan) yang mengembangkannya menjadi pathname nyata. Sebagai ilustrasi, ~/Documentskira-kira sama dengan $HOME/Documents(lagi, sintaks shell). Karena $HOMEharus menjadi jalur absolut, nilai $HOME/Documents juga merupakan jalur absolut. Tetapi teks $HOME/Documentsatau ~/Documentsharus diperluas oleh shell untuk menjadi jalan yang kita maksud.

Jadi jika saya ingin menjadi tepat dan konsisten, saya akan mengatakan itu ~/Documentsadalah sebuah fragmen dari shell-script yang berkembang ke jalur absolut.

Kevin Reid
sumber
Tentu saja, kernel tidak akan tahu apa $HOMEartinya, sama seperti kernel tidak tahu apa ~artinya. Namun saya menemukan klaim bahwa ~ ekspansi dilakukan oleh shell menjadi meragukan; sebagian besar aplikasi mendukung ini, yang mengarah ke pustaka C daripada shell. Namun ekspansi variabel lingkungan adalah fitur shell; Anda dapat membuka ~/somefile.odtdi LibreOffice, tetapi tidak $HOME/somefile.odt, bahkan jika LibreOffice dimulai dari shell di mana $ HOME diatur dengan benar.
CVn
5
Anda dapat menganggapnya meragukan semua yang Anda inginkan, tetapi ini didokumentasikan dan harus mudah dikonfirmasikan atau dibantah dalam C.
Useless
6
Program lain mengimplementasikan ~sintaksis yang meniru shell, karena ini adalah jalan pintas yang bermanfaat. Saya tidak benar-benar tahu apakah ada fungsi perpustakaan yang melakukan ekspansi, tapi itu pasti sesuatu yang dilakukan secara terpisah dari benar-benar menggunakan pathname.
Kevin Reid
2
globdan wordexpmelakukan ekspansi antara lain.
o11c
2
@ MichaelKjörling: Beberapa program mengimplementasikan ~ekspansi; kebanyakan tidak. Misalnya, jika Anda mengetik ls -l ~, lsprogram tidak pernah melihat ~karakter; itu diperluas oleh shell sebelum lsdipanggil. Jika Anda benar-benar lulus ~untuk ls, itu tidak akan memperlakukannya secara khusus; coba ls -l '~'`(yang akan mencoba membuat daftar file bernama harfiah ~).
Keith Thompson
16

Jika Anda $HOMEyaitu /home/white/, ~/Documents(sama seperti $HOME/Documents) diperluas oleh shell (lihat di sini untuk penjelasan) untuk /home/white/Documents, yang merupakan mutlak jalan.

Path relatif adalah path yang tidak dimulai dengan /(setelah ekspansi shell), seperti ../Documentsataufoo/bar

Beberapa kerang tua tidak memperluas ~(jalan bash, tcsh, zsh, dll ... lakukan); mereka akan melihat ~/Documentssebagai jalan relatif yang dimulai dengan ~; tetapi Anda biasanya tidak memiliki nama direktori seperti ~(tetapi Anda mungkin membuatnya dengan mkdir '~', yang saya tidak sarankan).

Basile Starynkevitch
sumber
Anda harus menyebutkan cangkang mana yang tidak mengembang~
Edward Torvalds
3

Sebuah path absolut dimulai pada /(apa yang mengacu pada adalah tetap), sebuah path relatif dimulai di direktori saat ini (dan apa yang mengacu pada perubahan karena perubahan direktori saat ini). Sebagian besar shell menggunakan ~di awal sebagai singkatan untuk path absolut ke direktori home dari pengguna saat ini, yaitu, ~/Documentsdirektori Documentsdi rumah pengguna saat ini, terlepas dari apa direktori saat ini mungkin. Jadi itu adalah jalan absolut.

vonbrand
sumber
1

Jalur dapat diperluas ke lokasi yang berbeda tergantung pada siapa pengguna. Karena itu, menurut saya, ini masih jalur absolut, bukan jalur relatif. Namun, saya tidak berpikir definisi jalur absolut dan relatif didefinisikan secara tepat. Ini bukan matematika. Pertanyaan ini sebenarnya tidak menguji pemahaman, dan menurut saya tidak ada gunanya.

Faheem Mitha
sumber
Definisi ini jauh lebih dari sekadar opini. Wikipedia menikamnya untuk kasus umum, bukan hanya Unix: en.wikipedia.org/wiki/…
Peter Cordes
1

Penggunaan ~ / di awal membuat path absolut karena (dengan definisi apa pun) dapat menemukan dokumen tidak bergantung pada di mana Anda saat ini. Namun ekspansi dilakukan oleh shell, bukan kernel, jadi jika Anda menggunakan shell yang tidak mengenali sintaks ini (seperti / bin / sh, shell Bourne asli, bukan bash alias), Anda akan keluar dari keberuntungan.

Menariknya, jika Anda menggunakan ~ root / daripada ~ /, optimalisasi membaca $ HOME biasanya tidak berlaku dan itu akan selalu menjadi absolut jika / etc / passwd benar.

jrrk
sumber
-1

Buku ini tampaknya mengambil pandangan bahwa jalan absolut adalah jalan apa pun yang dimulai dengan a /, dan jalan relatif adalah yang lainnya.

Anda mungkin melihat ..dan $HOMEsebagai jenis token yang serupa. Keduanya harus diganti, untuk komponen jalur, sebelum jalur tersebut memutuskan ke jalur absolut.

jl6
sumber
3
Bagaimana ..hal seperti $HOME? ..bisa di awal jalur yang dilewati secara langsung ke panggilan sistem, tidak perlu ekspansi shell. Jalan seperti itu bukanlah jalan yang absolut; itu masih relatif terhadap proses cwd atau lokasi symlink. Kecuali penulis mencoba untuk menangkap Anda dengan berbicara tentang string literal (tanpa ekspansi shell) sebagai jalan. Saya pikir Anda mencoba membuat alasan untuk buku itu, tapi saya lebih cenderung mengatakan itu salah dan tidak membiarkan hal-hal menjadi kacau.
Peter Cordes