Saya sedang mengerjakan skrip python yang melewati lokasi file ke subproses scp. Tidak apa-apa, tapi saya berada dalam situasi di mana saya akhirnya bisa menyatukan jalur dengan nama file sehingga ada dua ' /
di jalur. Saya tahu bahwa bash tidak peduli jika Anda memiliki beberapa pemisah file, tapi saya bertanya-tanya bagaimana tepatnya hal itu diperbaiki. Apakah itu bash yang strip ekstra /
atau benar-benar tidak masalah?
Saya bertanya karena ini akan menyelamatkan saya beberapa baris kode untuk memeriksa tambahan /
saat menggabungkan. Saya tahu ini bukan masalah besar, tapi saya juga ingin tahu. Saya memiliki skrip bash yang memiliki garis cd //usr
(bukan cd /usr
), yang tampaknya menyiratkan mungkin ada pentingnya menggunakan beberapa /
s di jalur
join
danabspath
perintah-perintah semacam itu.Jawaban:
Beberapa tebasan diizinkan dan setara dengan tebasan tunggal. Dari spesifikasi Single Unix (versi 3) , definisi dasar §3.266 nama path : "Beberapa garis miring berturut-turut dianggap sama dengan satu garis miring."
Ada satu pengecualian: jika sebuah nama path dimulai dengan tepat dua garis miring, ia mungkin diperlakukan secara berbeda (ref: definisi dasar §4.11 resolusi nama path ). Linux sendiri tidak melakukan ini, meskipun beberapa aplikasi mungkin, dan sistem unix-ish lainnya melakukannya (misalnya Cygwin).
Trailing
/
di akhir pathname memaksa pathname untuk merujuk ke direktori. Dalam definisi dasar dalam ( POSIX 1003.1-2001 (Single Unix v3) §4.11 resolusi pathname , sebuah trailing/
setara dengan sebuah trailing/.
. Definisi dasar POSIX 1003.1-2008 (Single Unix v4) §4.12 menghilangkan persyaratan untuk membuatnya setara dengan/.
, dalam urutan untuk mengatasi direktori yang tidak ada (misalnyamkdir foo/
diperlukan untuk bekerja, sedangkanmkdir foo/.
tidak akan - melihat alasan perubahan).Untuk program yang bertindak pada entri direktori, jika
foo
tautan simbolis ke direktori, maka lewatfoo/
adalah cara untuk membuat program bertindak di direktori alih-alih tautan simbolis.¹ Perhatikan bahwa ini hanya berlaku untuk resolusi pathname, yaitu saat mengakses file. Manipulasi nama file dapat bekerja secara berbeda. Misalnya
basename
dandirname
abaikan garis miring garis miring.sumber
/.
telah dihapus setelah proses diskusi selanjutnya karena ambigu. Pokoknya +1 sebagai menemukan informasi seperti ini dirangkum dengan baik adalah sulit.OS tampaknya juga tidak peduli, karena baru saja mencoba program C dengan syscall langsung untuk membuka dengan // di jalan.
Anda dapat menggunakan fungsi pustaka python os.path.normpath untuk menormalkannya, yang menghemat Anda harus memindai melalui string mencari tambahan. Bahasa lain memiliki fungsi serupa.
http://docs.python.org/library/os.path.html#os.path.normpath
sumber
Pada semua sistem Unix yang saya lihat itu sama dengan satu
/
, tetapi standar Unix menentukan itusehingga dapat ditangani secara khusus, tergantung pada sistem Anda. (Beberapa versi Unix yang lebih lama menggunakan terkemuka ganda
/
untuk akses sistem file jarak jauh, dan mungkin masih ada beberapa yang melakukannya.)sumber
//remote/...
ke akses sistem file jarak jauh, mungkin untuk konsistensi dengan Windows\\remote\...
.//remote/...
yang sama dengan\\remote\...
format path UNC .//
dengan cara khusus, karena mereka dapat mengujifalse
untuk menjadi mutlak, sesuai dengan spesifikasi Unix / POSIX.Gunakan
os.path.join
dengan Python dan Anda tidak akan mendapatkan banyak garis miring. Membangun nama file sendiri dengan menggabungkan string dianggap gaya Python yang buruk.sumber
/
sangat baik.Tidak ada perbedaan.
Beberapa garis miring diabaikan (tanpa efek), misalnya:
sumber
Tentu saja Anda dapat menormalkan jalan dengan kemungkinan beberapa / (garis miring) di dalamnya dengan melewati itu
tr -s
... lalu gunakan
$NORMALIZED
Namun, itu harus dilakukan. Seperti yang saya tahu kernel UNIX dengan benar harus mengabaikan pemisah jalur bersamaan --- atau secara konseptual memperlakukan mereka sebagai ...
/./
...sumber