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 ~/Documents
adalah 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 $HOME
variabel atau jalur direktori home user saat ini (lih. man bash
), Jadi path sebenarnya adalah /home/myuser/Documents
yang 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/../lib
yang 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 $HOME
tidak 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?
/
, 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.~/foo
jalur relatif. Apa yang Anda maksudkan adalah perbedaan antara hard-coding dan parameterisasi. Lihat jawaban saya untuk lebih jelasnya.~/Documents
dan$HOME/Documents
bukan 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.Jawaban:
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.2
vs.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. misalnyaDebian kadang-kadang akan menginstal symlink
../../doc/whatever/whatever
, bukan target symlink absolut, sehingga berfungsi ketika NFS dipasang di tempat lain, atau ketika melihat chroot tanpachroot(8)
memasukkannya.Setiap proses Unix memiliki cwd sendiri. The
pwd
perintah 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/myprog
skrip shell akan membuatnya berfungsi berbeda untuk pengguna yang berbeda. Perbedaan antara~/bin/foo
dan/home/peter/bin/foo
adalah 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
,~/foo
akan berkembang ke jalur relatif. Ini sama sekali bukan pengaturan yang bisa digunakan.sumber
/opt/kde3/bin/../lib
misalnya 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 :)!realpath(1)
) melakukan keduanya: mengkanoniskan dan membuat absolut (serta mengikuti symlink), sehingga mungkin beberapa kebingungan merayap di sana.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,~/Documents
kira-kira sama dengan$HOME/Documents
(lagi, sintaks shell). Karena$HOME
harus menjadi jalur absolut, nilai$HOME/Documents
juga merupakan jalur absolut. Tetapi teks$HOME/Documents
atau~/Documents
harus diperluas oleh shell untuk menjadi jalan yang kita maksud.Jadi jika saya ingin menjadi tepat dan konsisten, saya akan mengatakan itu
~/Documents
adalah sebuah fragmen dari shell-script yang berkembang ke jalur absolut.sumber
$HOME
artinya, 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.odt
di LibreOffice, tetapi tidak$HOME/somefile.odt
, bahkan jika LibreOffice dimulai dari shell di mana $ HOME diatur dengan benar.~
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.glob
danwordexp
melakukan ekspansi antara lain.~
ekspansi; kebanyakan tidak. Misalnya, jika Anda mengetikls -l ~
,ls
program tidak pernah melihat~
karakter; itu diperluas oleh shell sebelumls
dipanggil. Jika Anda benar-benar lulus~
untukls
, itu tidak akan memperlakukannya secara khusus; cobals -l '~
'`(yang akan mencoba membuat daftar file bernama harfiah~
).Jika Anda
$HOME
yaitu/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../Documents
ataufoo/bar
Beberapa kerang tua tidak memperluas
~
(jalanbash
,tcsh
,zsh
, dll ... lakukan); mereka akan melihat~/Documents
sebagai jalan relatif yang dimulai dengan~
; tetapi Anda biasanya tidak memiliki nama direktori seperti~
(tetapi Anda mungkin membuatnya denganmkdir '~'
, yang saya tidak sarankan).sumber
~
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,~/Documents
direktoriDocuments
di rumah pengguna saat ini, terlepas dari apa direktori saat ini mungkin. Jadi itu adalah jalan absolut.sumber
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.
sumber
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.
sumber
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$HOME
sebagai jenis token yang serupa. Keduanya harus diganti, untuk komponen jalur, sebelum jalur tersebut memutuskan ke jalur absolut.sumber
..
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.