Saya sedang menulis perpustakaan untuk memanipulasi string jalur Unix. Karena itu, saya perlu memahami beberapa sudut sintaksis yang tidak dikhawatirkan oleh kebanyakan orang.
Sebagai contoh, sejauh yang saya tahu, tampaknya itu foo/bar
dan foo//bar
keduanya menunjuk ke tempat yang sama.
Juga, ~
biasanya singkatan dari direktori home pengguna, tetapi bagaimana jika itu muncul di tengah jalan? Lalu apa yang terjadi?
Ini dan beberapa lusin pertanyaan tidak jelas lainnya perlu dijawab jika saya akan menulis kode yang menangani setiap kasus yang mungkin dengan benar. Adakah yang tahu referensi definitif yang menjelaskan aturan sintaksis yang tepat untuk hal ini?
(Sayangnya, mencari istilah seperti "Unix path syntax" hanya menghasilkan sejuta halaman yang membahas $PATH
variabel ... Heck, saya bahkan berjuang untuk menemukan tag yang cocok untuk pertanyaan ini!)
~
) tercakup dalam Bagaimana linux menangani pemisah banyak path (/ home //// username /// file) . Hal yang paling dekat dengan referensi normatif adalah spesifikasi POSIX atau Single Unix - tidak mudah dibaca.Jawaban:
Ada tiga jenis jalur:
foo
,foo/bar
,../a
,.
. Mereka tidak memulai dengan/
dan relatif terhadap direktori saat ini dari proses membuat panggilan sistem dengan jalur itu./
,/foo/bar
atau///x
. Mereka mulai dengan 1, atau 3 atau lebih/
, mereka tidak relatif, dilihat mulai dari/
direktori root.//foo
untuk diperlakukan secara khusus, tetapi tidak menentukan caranya. Beberapa sistem menggunakannya untuk kasus khusus seperti file jaringan . Itu harus tepat 2 garis miring.Selain pada awalnya, urutan garis miring bertindak seperti satu.
~
hanya khusus untuk shell , itu diperluas oleh shell, itu tidak spesial untuk sistem sama sekali. Bagaimana itu diperluas tergantung pada shell. Kerang melakukan bentuk ekspansi lain seperti globbing (*.txt
) atau ekspansi variabel/$foo/$bar
atau lainnya. Sejauh menyangkut sistem~foo
hanyalah jalur relatif seperti_foo
ataufoo
.Hal-hal yang perlu diingat:
foo/
tidak sama denganfoo
. Ini lebih dekatfoo/.
daripadafoo
(terutama jikafoo
symlink) untuk sebagian besar panggilan sistem pada sebagian besar sistem (foo//
sama sepertifoo/
olah).a/b/../c
tidak harus sama dengana/c
(misalnya jikaa/b
symlink). Yang terbaik adalah tidak memperlakukan..
secara khusus.a/././././b
samaa/b
.sumber
/
,.
dan..
(?)//foo
penanganan ada di Cygwin, di mana digunakan untuk jalur UNC . Yaitu,//server/share/dir/file.txt
adalah jalur hukum yang menunjukkan off-system secara default. Cygwin kembali ke sistem lokal jika tidak dapat menemukannyaserver
.Iya. Ini umum karena perangkat lunak kadang-kadang menyatukan jalur dengan asumsi bagian pertama tidak diakhiri dengan garis miring, sehingga orang dilemparkan untuk memastikan (artinya mungkin ada dua atau lebih).
foo///bar
danfoo/////bar
juga menunjuk ke tempat yang sama denganfoo/bar
. Fungsi yang bagus untuk pustaka manipulasi lintasan akan menjadi yang mengurangi sejumlah garis miring berurutan menjadi satu (kecuali pada awal jalan, di mana ia dapat digunakan dalam cara URL-ish, atau, seperti ditunjukkan Stephane, untuk setiap tujuan khusus yang tidak ditentukan).Transformasi itu dilakukan melalui exapansion shell dan tilde , yang hanya berfungsi jika itu adalah karakter pertama di jalan. Apakah Anda perlu menangani ini atau tidak, tergantung pada konteksnya. Jika pustaka akan digunakan dengan program normal yang menerima, misalnya, argumen baris perintah yang berisi jalur, tilde ekspansi sudah dilakukan ketika mereka melihat jalan. Satu-satunya situasi yang saya anggap sebagai masalah adalah jika Anda memproses jalur langsung dari file teks.
Di luar itu,
~
adalah karakter hukum di jalur * nix dan tidak boleh diubah ke yang lain. Sesuai dengan ini , satu-satunya karakter yang tidak legal dalam nama file unix adalah/
(karena itu adalah pemisah path) dan "null" (alias. Nol byte) karena mereka ilegal dalam teks pada umumnya.sumber
//
secara teknis juga tidak begitu. Baik URL dan yang lebih baru, menurut-ke-SC spec ambigu bebas untuk//
mungkin telah diturunkan dari itu, dalam hal ini "URL-ish" tampaknya label yang cocok untuk konvensi (bahkan jika UNC lebih tua, dan bahkan jika kemiripannya tidak disengaja). Saya tidak akan pernah mengatakan bahwa "mereka adalah URL", hanya itu//
atau\\
melayani tujuan "URL-ish".