Yol sözdizimi kuralları


10

Ben manipülasyon Unix yol dizeleri için bir kütüphane yazıyorum. Bu durumda, çoğu insanın endişe etmeyeceği sözdiziminin birkaç belirsiz köşesini anlamam gerekiyor.

Örneğin, anlayabildiğim kadarıyla, öyle görünüyor ki foo/barve foo//barher ikisi de aynı yere işaret ediyor.

Ayrıca, ~genellikle kullanıcının ana dizini anlamına gelir, ancak bir yolun ortasında görünüyorsa ne olur ? O zaman ne olacak?

Mümkün olan her durumu doğru şekilde işleyen bir kod yazacaksam, bu ve birkaç düzine başka soruya cevap verilmesi gerekiyor. Herkes bu şeyler için tam sözdizimi kurallarını açıklayan kesin bir referans biliyor mu ?

(Ne yazık ki, "Unix yol sözdizimi" gibi terimleri aramak, $PATHdeğişkeni tartışan bir milyon sayfayı açıyor ... Heck, bu soru için uygun etiketleri bulmakta bile zorlanıyorum!)


ok ~ tilde ve -filename genişletmeleri herhangi bir Unix ortamının temel POSIX tanımlı özellikleridir. Birkaç ipucu: bir dosya adı \ 0 veya / dışında herhangi bir şey olabilir . ////// ve / aynı şeydir. $ PWD çekirdeğe işlenir ve / proc içindeki herhangi bir (Linux) işlem için okunabilir . /./ yalnızca bir yolun kökünde oluşabilir. $ PATH ::::: ve: 'da aynı şeydir. / dev / null / dev / tty ve / tmp her uygun sistem için POSIX garantili yollardır.
mikeserv

1
Sorunuzun çoğu (ancak bir kısmı değil ~) linux birden çok yol ayırıcısını nasıl ele alır (/ home //// kullanıcıadı /// dosyası) . Normatif bir referansa en yakın şey POSIX veya Tek Unix spesifikasyonu olacaktır - kolay okuma değil.
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


13

Üç tür yol vardır:

  • ilgili yollar gibi foo, foo/bar, ../a, .. Bunlar /, bu yolla sistem çağrısı yapan işlemin geçerli diziniyle başlamaz ve görecelidir.
  • mutlak yollar gibi /, /foo/barya da ///x. 1 veya 3 veya daha fazla ile başlarlar, /göreceli değildirler, /kök dizinden başlayarak aranırlar.
  • POSIX //fooözel olarak ele alınmasına izin verir , ancak nasıl yapılacağını belirtmez. Bazı sistemler bunu ağ dosyaları gibi özel durumlar için kullanır . Tam olarak 2 eğik çizgi olmalıdır.

Başlangıçtan başka, eğik çizgi dizileri bir gibi davranır.

~sadece kabuk için özeldir, kabuk tarafından genişletilir, sistem için hiç özel değildir. Nasıl genişlediğine kabuk bağımlıdır. Kabuklar, globbing ( *.txt) veya değişken genişleme /$foo/$barveya diğerleri gibi diğer genişletme biçimlerini yapar . Sistem söz konusu olduğunda ~foo, _fooveya gibi göreli bir yoldur foo.

Akılda tutulması gereken şeyler:

  • foo/ile aynı değildir foo. Bu yakın içelim foo/.daha foo(özellikle fooen sistemlerde en sistem çağrıları için bir sembolik bağdır) ( foo//aynıdır foo/rağmen).
  • a/b/../cmutlaka aynı değildir a/c(örneğin a/b, bir sembolik bağlantıysa). En iyisi ..özel muamele etmek değildir .
  • a/././././baynı düşünmek genellikle güvenlidir a/b.

Yani özet olarak, eğer kabuk yolu manipülasyonu (bu çok geniş ve karmaşık) umurumda değil, ben sadece umurumda /, .ve ..(?)
MathematicalOrchid

//fooİşleme örneği UNC yolları için kullanıldığı Cygwin'dedir . Yani, //server/share/dir/file.txtvarsayılan olarak sistem dışı olan yasal bir yoldur. Cygwin bulamazsa yerel sisteme bakmaya geri döner server.
Warren Young

3

Örneğin, anlayabildiğim kadarıyla, foo / bar ve foo // bar'ın her ikisi de aynı yere işaret ediyor gibi görünüyor.

Evet. Bu yaygındır, çünkü yazılım bazen ilk kısmın eğik çizgi ile sonlandırılmadığını varsayarak bir yolu birleştirir, bu yüzden emin olmak için bir tane atılır (yani iki veya daha fazla olabilir). foo///barve foo/////baraynı yere işaret ediyor foo/bar. Bir yol manipülasyon kütüphanesi için güzel bir işlev, herhangi bir sayıda ardışık eğik çizgiyi bire indirgeyen bir işlevdir (bir yolun başlangıcında, URL-ish yolunda kullanılabileceği veya Stephane'nin belirttiği gibi, herhangi biri için) belirtilmemiş özel amaç).

Ayrıca, ~ genellikle kullanıcının ana dizini anlamına gelir

Bu dönüşüm, yalnızca yoldaki ilk karakterse çalışan kabuk ve tilde genişlemesi yoluyla yapılır . Bununla başa çıkmanız gerekip gerekmediği bağlama bağlıdır. Kitaplık, örneğin bir yol içeren komut satırı bağımsız değişkenlerini alan normal programlarla kullanılacaksa, tilde genişletme yolu gördüklerinde zaten yapılır . Endişe olduğunu görebildiğim tek durum, yolları doğrudan bir metin dosyasından işliyorsanız.

Bunun ötesinde, ~* nix yolunda yasal bir karakterdir ve başka hiçbir şeyle değiştirilmemelidir. Buna göre , bir unix dosya adında yasal olmayan tek karakterler /(yol ayırıcı olduğu için) ve "boş" (diğer adıyla sıfır bayt), çünkü genellikle metinde yasadışıdır.


Yaklaşık işareti genişlemesinin açıklaması için +1; Onunla diğer kullanıcılara başvurabileceğine dair hiçbir fikrim yoktu!
Matematiksel

2
Stephane'nin dediği gibi, tekrarlanan tüm eğik çizgileri körü körüne çökertemezsiniz. Yolun başlangıcındaki çoklu eğik çizgiler dikkatle ele alınmalıdır.
Warren Young

@WarrenYoung Bunu netleştirmek için düzenlendi. PS. İleri ??! O_O
goldilocks

Daha iyisi, bunun URL'lerle bir ilgisi olduğunu söyleyemem. UNC 1980'lerin sonlarına kadar giderken, URL'ler yıllar sonra görünmedi.
Warren Young

UNC en gibi görünüyor olsa da @WarrenYoung Yeterince adil, MS platformlara özeldir , bu yüzden //teknik olarak bu da değil. Hem URL'ler hem de SC'ye göre daha yeni, belirsiz belirsiz POSIX spesifikasyonları bu türden türetilmiş // olabilir , bu durumda "URL-ish" konvansiyon için uygun bir etiket gibi görünür (UNC'ler daha eski olsa bile ve benzerlik olsa bile) kasıtsız). Asla "onlar URLS" olduğunu söyleyebilirim, sadece bu //veya \\ bir "URL-ish" amaca hizmet eder.
goldilocks
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.