Bir dizin yolu değişkeni sonunda eğik çizgi ile bitmeli mi?


88

Bir dizine giden yolu değişken veya sabit olarak tanımlarken, sonda eğik çizgi ile bitmeli mi? Sözleşme nedir?

pwdUnix'te, mevcut dizininizi bölü çizgisi olmadan gösterirken, sekme tamamlanan cd /var/www/apps/sondaki eğik çizgiyi içeriyor, bu da beni belirsiz bıraktı.

Yanıtlar:


24

Örneğin, dosyaları depolamak için bir dizin tanımladığımda sondaki bölü çizgisini eklemiyorum. Bunun nedeni, onu şu şekilde kullanacağım

$store_file = "$store_path/$file_id";

Bir dizin yolunu tutması gereken bir değişkeni kullanmadan önce daima bir eğik çizgi ekleyeceğim. Sondaki eğik çizginin dahil edilip edilmediğini merak etmektense her zaman bir tane eklemenin daha iyi olduğunu düşünüyorum.


29
Sonunda bölü çizgisinin olmaması, $ store_path içindeki yolun bir dosya mı yoksa dizin mi olduğu belirsiz anlamına gelir. "/ tmp / store_data" bir dosya mı yoksa dizin mi?
Darwin

4
PHP'nin realpath () işlevi gibi bir şey kullanırken , sondaki eğik çizgiyi yazdırmaz. Sisteminiz ve araçlarınız, kurallarınızı belirleyebilir.
jmbertucci

10
Herhangi bir yerde birden fazla eğik çizgi olması genellikle tek bir eğik çizgi olarak yorumlanacaktır. Böylelikle buna benzer bir şeye sahip olabilirsiniz '///' + $root + '//' + $file + '/'ve bu fark etmez. Sondaki eğik çizgiye sahip olmak, yolun bir dosya veya dizin olup olmadığını ayırt etmenin iyi bir yolu olsa da , eklenen yolun sonunda bir eğik çizgiye sahip '/' + $rootolduğundan $root + '/'emin olamayacağınız gibi yollara eklemek daha iyi olacaktır. , ancak birden çok eğik çizginin çoğu ortamda tek bir eğik çizgi olarak yorumlanacağından nispeten emin olabilirsiniz.
Xtrinity

3
@MatthewSlyman, Demek istediğim, herkesin /tmp/store_data/bunun bir dizin olmasını beklemesiydi , oysa aynı yolun kesik çizgi olmadan ne olduğu belirsiz/tmp/store_data
Darwin

6
Bununla ilgili sorun şudur: Bir değişken yoksa, rm -rf $foo/$barrm -rf /
boşla

102

Sondaki eğik çizgiyle gidiyorum çünkü:

  1. "Eğik çizgiyle bitiyorsa, bu bir dizindir. Değilse, bir dosyadır." hatırlanması kolay bir sözleşmedir.

  2. En azından yaygın olarak kullandığım işletim sistemlerinde, eğik çizgiyi iki katına çıkarmak herhangi bir soruna yol açmazken, eğik çizgiyi atlamak büyük olanlara neden olur. Bu nedenle, hem eğik çizgiyi değişkene koymak hem de onu kullanırken "$ yol / $ dosya" kullanmak en güvenli yoldur.


9
Bir dizin yolu bir dosya yolundan yalnızca dizin yolunun sonunda bir eğik çizgi varsa ayırt edilebilir.
Darwin

4
Birden çok eğik çizgi, yol çift eğik çizgiyle başlamadığı sürece bir eğik çizgiye eşdeğerdir. Bkz. Unix.stackexchange.com/questions/1910/…
jdh8

4
Ayrıca, vaariable'ın sonuna bölü çizgisi eklemek, "$ yol / $ dosya" yerine "$ yol $ dosya" kullanılmasına izin verir, bu da boş $ yoluna izin verir - yani geçerli çalışma dizini. Ancak eğik çizgi yerine asla ters eğik çizgi kullanmayın.
fantastory

Dosya tanımlayıcıları da kullanışlıdır
Francesco Gualazzi

@ jdh8 Yol çift eğik çizgilerle başlasa bile, yine de bir bölü çizgisine eşit olmalıdır. Yine de bu, uygulamadan uygulamaya değişebilir. Unix standartları A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash., çoğunlukla, yaygın uygulamalarda çift eğik çizgilerin genellikle tek bir eğik çizgi olarak yorumlandığı gözlemlenmiştir.
Xtrinity

14

Bunun 10 yaşında olduğunu biliyorum, ancak çok düşünceli 0,02 dolarımı da atmak istedim.

Hayır. Hayır. Kesinlikle hayır.

Bir Unix sisteminden bahsediyoruz. Dizinin kendisine referans olarak, diğerleri gibi bir düğümdür. Dizinine söz konusu olduğunda, her zamankinden adında Çıkışsız eğik çizgi olmamalıdır (ref: dirname, pwd, ~, echo $HOME, echo $PATH, çıktısı lsvd).

Bir dizinin içeriğine atıfta bulunulduğunda, o zaman bir çizgi gerekir. Yani, ls /home/karl/daha uygundur ls /home/karl(FTR, neredeyse her zaman ikincisini yaparım çünkü ... iyi, tembel).

Bir dosyanın tam yolunu oluşturmak için bir dizin içeren bir değişkeni kullanırken, her zaman bölü çizgisini (i., E :) eklemeyi beklersiniz cp ${HOME}/test ${OTHER_DIR}/.

Edilir beklenen bir dizin eğik çizgi bitmeyen söyledi. Bir dizinin bölü çizgisiyle bittiği yönündeki herhangi bir beklenti yanlıştır. Bu nedenle, bir *_DIRdeğişkenin değerinin sonuna bir eğik çizgi eklemek beklentileri altüst eder.

Sekme tamamlanması için olduğu gibi, burada beklenti gidiyorsun olmasıdır içine bu dizine. Bu nedenle, sekme tamamlamanın sağladığı yardım, sizi o dizine sokmaktır, böylece içeriğine göre bir sonraki seçimi yapabilirsiniz.

(yorumlardan referans: Wikipedia sayfasından Filepath Yanlış KavramlarıTalk:Path_(computing) . Teşekkürler, john cj )

Bunun yanlış olması, araçların / paketlerin / kitaplıkların asla bunu yapmadığı anlamına gelmediğini belirtmekte fayda var. Bu tür şeylerin, hiçbirinin olmaması gerektiğinde bir eğik çizgi eklemesi çok yaygın bir durumdur. Bu nedenle, Bevan ve Paul F'nin her ikisinin de önerdiği gibi, 3. taraf araçlarını kullanırken, dizin adlarında olabilecek sondaki eğik çizgileri kaldırmak en iyisidir.

Unix Inode'lar

Inode (dizin düğümü), bir dosya veya dizin gibi bir dosya sistemi nesnesini tanımlayan Unix tarzı dosya sistemindeki bir veri yapısıdır.

- https://en.wikipedia.org/wiki/Inode

Dosya Sistemi Hiyerarşisi Standardı

Unix dosya sistemi (Dosya Sistemi Hiyerarşi Standardı, AKA FHS) için standart açıkça bir bölü sahip olarak dizinleri yer almazlar olduğunu göstermektedir, bunun yerine dizin içeriği göreli olduğu (Bunun tek istisnası /biz atıfta olmaz çünkü dosya sistemi kökü boş bir dizge kullanarak ... ve kimse orada hiçbir zaman dosya yaratmamalı.)

- http://www.pathname.com/fhs/pub/fhs-2.3.html

- https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard


Mükemmel cevap. Bu yaklaşımı kullanma eğilimindeydim, ancak nedenim konusunda hiçbir zaman tam olarak tamamlanmadım. Onu çivilenen tek cevap bu.
Wardw

4
Bu kökü /desen kırar. Ve eğer muhakemenize buradan (yinelemeli olarak) başlayacak olursanız, farklı uygulamaların merkezinde olabilecek çelişkilere ulaşabilirsiniz (buradaki cevaplardan kanıtlandığı gibi). Ancak bunu istisna olarak kabul ettiğinizde, diğer her şey aynı hizaya gelir.
Wardw

Anlıyorum. Dirname ile biraz oynadı. Bir dizini bir yolda açık bir şekilde depolamayı düşünüyorsanız, yolu, noktanın geçerli dizini temsil ettiği bir "/." İle sonlandırın.
TamusJRoyce

2
@wardw, kök dizinin boş dizge olarak adlandırıldığını düşünebilirsiniz, oysa "/" boş bir dizedir ve ardından eğik çizgi gelir ve "kök dizinin içeriği" anlamına gelir.
bobpaul

1
Bu cevaba daha çok oy verilmelidir. Ayrıca Wiki'deki Filepath Yanlış Kanıları bölümüne bakın.
john cj

9

Evet, şu şekilde olmalıdır:

Yol adı + dosya adı = tam nitelikli dosya konumu.

Dolayısıyla, son dizin ile dosya adı arasındaki eğik çizginin ya yol adının sonunda ya da dosya adının başında olması gerekir. Dosya adlarının önüne / ile eklenmesi, yalnızca bir dosyayı açmak istiyorsanız (yani, geçerli çalışma dizininde nitelenmemiş bir dosya adının olduğunu varsayarsanız) bunu dikkate almanız gerektiği anlamına gelir.


5
.. ve bunu hesaba katmamak, muhtemelen yanlışlıkla / ile
uğraştığınız

5

Dizin yollarını depoladığımda veya API'lerden geri döndürdüğümde, sondaki eğik çizgi tutma kuralına sadık kalmaya çalışıyorum. Bu, "bir dosya mı yoksa dizin mi" belirsizliğini ortadan kaldırır.

Ek :
Bu, sondaki bir eğik çizgiyi veya bunun yokluğunu tolere edebilecek yöntemleri kullanmanın yerine geçme amaçlı değildir. Bu kuralı kullansam bile hala her zaman Path.Combine(...)ve benzer yöntemler kullanıyorum.


python:os.path.join(dir, subdir_or_file)
IceArdor

5

Belki de kararınızın dosyalar için ne anlama geleceğini düşünmelisiniz. Bir dizin adının sonuna bölü çizgisini eklemezseniz, bunu dosya adının başına eklemeniz gerekir .

Şimdi, herhangi bir nedenle, dizeleri birleştirdiğinizde dosyaya giden yol eksikse, sonuçta /filenamesadece bir dosya değil, kök dizinden mutlak bir yol (bu bağlamda nerede olursa olsun) gibi bir şey elde edersiniz. .

Bu yüzden yollarımı bölü çizgiyle bitiriyorum ve dosyaları dosya olarak tutuyorum.


1
Buradaki alternatif, dosya adınızı olarak ifade etmektir ./filename. Ancak genel olarak, bunu doğru bir şekilde yapmak için yolları birleştiren kodun sorumluluğu olmalıdır ve her iki şekilde de varsayımlarda bulunmamalıdır.
Wardw

4

Bunun eski bir konu olduğunu biliyorum ama yaptığım şeyi paylaşacağımı düşündüm. Mümkünse, normalde her ikisine de izin verir ve şöyle bir şey yaparım (eğer PHP ise):

$fullPath = rtrim($directory, '/') . '/filename.txt');

Bu şekilde, dizin bir yapılandırma dosyasında tanımlanmışsa, onu değiştirecek bir sonraki kişinin sondaki eğik çizgiyi içerip içermediği önemli değildir.


4

Php'de dirname (__ FILE __) işlevi dizin adını sonunda bölü çizgisi olmadan döndürdüğü için. Bu sözleşmeye bağlı kalmaya meyilliyim.

Aksi takdirde, bir dizin adının sonunda bir bölü çizgisi kullanmak, dirname (..) 'nin çalışma biçimiyle çelişir ve dizin adının bir dizin adından (..) gelip gelmediğini bilmediğiniz için iki durumu ele alırsınız. ) işlev veya sondaki eğik çizgiyle tanımlanan içerik.

Sonuç: Dirname (..) bunu yapmadığından, sondaki eğik çizgi kullanmayın.

// PHP Example
dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!

Diğer diller için, bir yol adı çıkaran işlevi kontrol edin ve sonda eğik çizgi kullanıp kullanmadığına bakın, sonra dil kuralına bağlı kalın.


2
Bir istisna: dirname ('/ test') = '/' - boş bir dizge döndürmek yerine, bu durumda dirname tek bir bölü çizgisi döndürür! Buradaki notlara bakın .
Matthew Slyman


2

Evet, herhangi bir uzantısı olmayan dosyaları destekleyen birçok dosya sistemi vardır, bu nedenle herhangi bir sorunu önlemek için her zaman sondaki eğik çizgiyi ekleyin.


1

Her iki şekilde de kesin bir kongre görmedim.

Yine de eminim ki, neye karar verirseniz verin, bir başkası bunun tam tersi olması gerektiğinden% 100 emin olacaktır. Bu nedenle, en iyi fikir, her iki şekilde de ayarlanmış olan şeyleri tolere etmektir.

.NET dünyasında, Path.Combine () bunu halletmek için size bir yol sunar - cmd dosyalarından başlayarak diğer ortamlarda eşdeğerleri vardır.


1

Sanırım bu, teorik ve pratik olarak doğru cevabın farklı olduğu ender durumlardan biri.

Görünüşe göre @Karl Wilbur'un cevabı teorik olarak doğru, çünkü dizin düğümüne yapılan bir referansı dizinin içeriğinden ayırt edebilmeniz gerekir.

Ama pratikte doğru cevabın tam tersi olduğunu savunacağım:

  • En önemli neden, yolun bir klasör, ancak belirsiz olduğunu kesin olarak anlayabilmenizdir . Bunun bir klasör dosyası olup olmadığını kimse anlayamaz. Spesifikasyonlar her zaman mümkün olduğunca kesin ve açık olmalıdır./home/FSObjectX//home/FSObjectX

  • Çoğu durumda, dir düğümünün kendisine değil, her zaman bir klasörün içeriğine başvurursunuz.
    Gerçekte yaptığınız bu nadir durumlarda, isteğe bağlı herhangi bir sondaki dir-ayırıcıyı kaldırarak kodda kolayca işlenebilir.

  • Çift dir-ayırıcı kullanmak herhangi bir zarar vermeyecektir, ancak birinin eksik olması kesin olacaktır.
    Teoride, "şans eseri" kodlamamanız gerektiği için kötü bir argüman, ancak pratikte, hatalar meydana gelir ve belki de sondaki dir-sep'i kullanmak, son kullanıcıda birkaç daha az çalışma zamanı hatasıyla sonuçlanabilir.

Bu ilginç konuyu okurken sondaki dir-sep kullanmanın herhangi bir dezavantajını bulamadım, sadece teorik olarak yanlış olduğunu. Yoksa bir şeyi mi özledim?


fiili uygulamada, uygun beklentinin sonda bir bölü işareti içermemesi gerektiğini göreceksiniz. Yetkili geliştiriciler tarafından yazılmış, kullandığınız her araca bakın.
Karl Wilbur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.