it-swarm-id.com

Bagaimana Linux menangani beberapa pemisah jalur berurutan (/ home //// nama pengguna ///)?

Saya sedang mengerjakan skrip python yang meneruskan lokasi file ke subproses scp. Semua baik-baik saja, tetapi saya berada dalam situasi di mana saya mungkin akhirnya menyatukan jalur dengan nama file sedemikian rupa sehingga ada dobel '/ di jalur. Saya tahu bahwa bash tidak peduli jika Anda memiliki beberapa pemisah file, tapi saya bertanya-tanya bagaimana tepatnya hal itu diperbaiki. Apakah ini bash yang menghapus ekstra /s atau apakah itu benar-benar tidak penting?

Saya bertanya karena itu akan menyelamatkan saya beberapa baris kode untuk memeriksa tambahan /s saat digabung. Saya tahu ini bukan masalah besar, tapi saya juga ingin tahu. Saya memiliki skrip bash yang memiliki baris cd //usr (dari pada cd /usr), yang tampaknya menyiratkan mungkin ada pentingnya menggunakan beberapa /s di jalur

117
Falmarri

Beberapa tebasan diizinkan dan setara dengan tebasan tunggal. Dari spesifikasi Unix Tunggal (versi 4) , definisi dasar §3.271 pathname : "Beberapa garis miring berturut-turut dianggap sama dengan satu garis miring."

Ada satu pengecualian: Jika nama path dimulai dengan dua karakter berturut-turut, komponen pertama yang mengikuti karakter utama dapat ditafsirkan dengan cara yang ditentukan implementasi. (ref: definisi dasar §4.13 resolusi pathname ). Linux sendiri tidak melakukan ini, meskipun beberapa aplikasi mungkin, dan sistem unix-ish lainnya melakukannya (mis. Cygwin).

Trailing / di akhir pathname memaksa pathname untuk merujuk ke direktori. Definisi dasar dalam ( POSIX 1003.1-2001 (Single Unix v4) §4.11 resolusi nama path , sebuah trailing / setara dengan trailing /.. POSIX 1003.1-2008 (Single Unix v4) definisi dasar §4.1 menghapus persyaratan untuk membuatnya setara dengan /., untuk mengatasi direktori yang tidak ada (mis. mkdir foo/ wajib bekerja, sedangkan mkdir foo/. tidak akan - melihat rasional untuk perubahan).

Untuk program yang bertindak pada entri direktori, jika foo adalah tautan simbolis ke direktori, maka melewati foo/ adalah cara untuk membuat program bertindak pada direktori alih-alih tautan simbolik.

¹ Perhatikan bahwa ini hanya berlaku untuk resolusi pathname, yaitu saat mengakses file. Manipulasi nama file dapat bekerja secara berbeda. Misalnya basename dan dirname abaikan trailing slash.

OS tampaknya juga tidak peduli, karena baru saja mencoba program C dengan syscall langsung untuk membuka dengan // di jalan.

Anda dapat menggunakan fungsi perpustakaan python os.path.normpath untuk menormalkannya, yang menghemat Anda harus memindai melalui string mencari tambahan. Bahasa lain memiliki fungsi yang serupa.

http://docs.python.org/library/os.path.html#os.path.normpath

17
Ivatar

Pada semua sistem Unix yang saya lihat sama dengan satu /, tetapi standar Unix menentukan itu

Pathname yang dimulai dengan dua garis miring berturut-turut dapat diinterpretasikan dengan cara implementasi yang ditentukan, meskipun lebih dari dua garis miring utama harus diperlakukan sebagai garis miring tunggal.

sehingga dapat ditangani secara khusus, tergantung pada sistem Anda. (Beberapa versi Unix yang lebih lama menggunakan pemimpin ganda / untuk akses sistem file jarak jauh, dan mungkin masih ada beberapa yang melakukannya.)

9
Fred Foo

Gunakan os.path.join dalam Python dan Anda tidak akan mendapatkan banyak garis miring. Membangun sendiri nama file dengan merangkai string dianggap buruk Python.

7
Neil Mayhew

Tidak ada perbedaan.

Beberapa garis miring diabaikan (tanpa efek), mis .: .:

ls -al //usr///////bin/sed
3
ChristopheD

Tentu saja Anda dapat menormalkan jalan dengan kemungkinan beberapa/(garis miring) di dalamnya dengan melewati tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... dan kemudian gunakan $NORMALIZED

Namun, itu harus dilakukan. Seperti yang saya tahu kernel UNIX dengan benar harus mengabaikan pemisah path bersamaan --- atau secara konseptual memperlakukan mereka sebagai ..././...

0
Jim Dennis