it-swarm-tr.com

Linux art arda birden çok yol ayırıcısını (/ home //// kullanıcıadı /// dosyası) nasıl işler?

Ben bir scp alt işlem dosya konumlar geçiren bir python komut dosyası üzerinde çalışıyorum. Hepsi iyi, ama ben böyle bir dosya adı ile bir yol bitirme kadar bir durumda ben yolda bir çift '/ var. Ben bash birden fazla dosya ayırıcılar varsa umurumda değil biliyorum, ama tam olarak nasıl düzeltildi merak ediyorum. Ekstra şeritler yapan bash mı / s ya da gerçekten hiç önemli değil mi?

Ben soruyorum çünkü birleştirirken ekstra / S kontrol etmek için bana birkaç satır kod kaydedecektir. Çok önemli olmadığını biliyorum, ama merak ediyorum. Birden fazla cd //usr S bir yolda kullanmak için bir anlamı olabilir ima gibi görünüyor cd /usr (/ Yerine) olan bir bash komut dosyası var

117
Falmarri

Birden çok eğik çizgiye izin verilir ve tek bir eğik çizgiye eşdeğerdir. Tek Unix belirtiminden (sürüm 4) , temel tanımlar §3.271 yol adı : “Ardışık birden fazla eğik çizgi, bir eğik çizgi ile aynı kabul edilir.”

Bir istisna vardır: Bir yol adı birbirini izleyen iki karakterle başlıyorsa, önde gelen karakterleri izleyen ilk bileşen, uygulama tanımlı bir şekilde yorumlanabilir. (ref: temel tanımlar §4.13 yol adı çözünürlüğü ). Linux'un kendisi bunu yapmaz, ancak bazı uygulamalar yapabilir ve diğer unix-ish sistemi bunu yapar (örn. Cygwin).

Bir yol adının sonundaki sonuna / Yol adını bir dizine başvurmaya zorlar. ( POSIX 1003.1-2001 (Tek Unix v4) temel tanımları §4.11 yol adı çözünürlüğü 'de, bir sondaki /, Sondaki /. İle eşdeğerdir. POSIX 1003.1-2008 (Tek Unix v4) temel tanımları §4.1 , var olmayan dizinlerle (ör. /.) Başa çıkmak için mkdir foo/ İle eşdeğer hale getirme gereksinimini ortadan kaldırır mkdir foo/. işe yaramazken değişiklik için mantıksal ifadesine bakın.

Bir dizin girdisi üzerinde çalışan programlar için, foo bir dizine sembolik bir bağlantıysa, foo/ 'Yu geçmek, programın sembolik bağlantı yerine dizinde çalışmasını sağlamanın bir yoludur.

¹ Bunun yalnızca yol adı çözümlemesi, yani dosyalara erişilirken geçerli olduğunu unutmayın. Dosya adı manipülasyonları farklı şekilde çalışabilir. Örneğin basename ve dirname sondaki eğik çizgileri yoksay.

İşletim sistemi de bunu umursamıyor, sadece yolda bir // ile açmak için doğrudan bir sistem çağrısı olan bir C programı denemiş.

Yine de normalleştirmek için python kütüphane işlevi os.path.normpath komutunu kullanabilirsiniz;.

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

17
Ivatar

Gördüğüm tüm Unix sistemlerinde tek bir /, ancak nix standardı şunu belirtir

İki ardışık eğik çizgi ile başlayan bir yol adı, uygulama tanımlı bir şekilde yorumlanabilir, ancak ikiden fazla önde gelen eğik çizgi tek bir eğik çizgi olarak ele alınacaktır.

bu nedenle sisteminize bağlı olarak özel olarak ele alınabilir. (Bazı eski Unix sürümlerinde çift önde gelen / uzak dosya sistemi erişimi için ve yine de bazı dosyalar olabilir.)

9
Fred Foo

Kullan os.path.join in Python ve birden fazla eğik çizgi elde edemezsiniz. Dizeleri birleştirerek dosya adlarını kendiniz oluşturmak kötü Python stili olarak kabul edilir).

7
Neil Mayhew

Fark yok.

Birden fazla eğik çizgi yok sayılır (etkisiz), örn .:

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

Tabii ki bir yolu tr -s İçinden geçirerek olası çoklu/(eğik çizgiler) ile normalleştirebilirsiniz.

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

... ve sonra $NORMALIZED kullanın

Ancak, gerekli olmalıdır. Bildiğim gibi UNIX çekirdeği eşzamanlı yol ayırıcıları görmezden gelmeli --- veya kavramsal olarak ... /./ ...

0
Jim Dennis