Linux'ta `//` yolu hangi dizini temsil ediyor?


13

Yazarak Linux'ta üst düzey dizine geri dönmek istediğimde cd .., yazdım cd //. Büyük bir sürprizle, hiçbir hata bildirilmedi. Dahası istem olur username@hostname://$. lsşu anda kök dizinde olduğumu gösterir.

Bu bir hata mı yoksa kabuğun bir özelliği mi? Bir özellik ise //, takma adıdır /? Kabuğum GNU bash, sürüm 4.1.5 (1) -release (i686-linux-gnu).

Teşekkür ve saygılarımla.


Yanıtlar:


30

Ya da düşünülebilir.

Linux'ta //hiçbir şey ifade etmez - birden fazla ardışık eğik çizgi , başlangıç ​​dahil olmak üzere yolun herhangi bir yerinde bire daraltılır . Dizin değiştirme //içeri koyar /çalışan olarak, readlink /proc/self/cwdsöylerdim; aynı şekilde, /usr//local///bindaraltılır /usr/local/bin.

Bununla birlikte, Cygwin veya eski Apollo Domain / OS gibi bazı diğer Unix benzeri sistemler, gibi ağ yolları için // öneki kullanır //fileserver/path/to/data. POSIX buna da izin verir.

Çeşitli nedenlerden ötürü, bash kabuğu geçerli dizini kendi başına izler (işletim sistemi tarafından sağlanan izlemeye ek olarak) ve //ilkinin daraltılmasını önleyen, bu tür sistemlerle uyumlu kalmasını engelleyen bir koda sahiptir . "Özellik", bash'ın geçerli dizinin daha sezgisel bir şekilde izlenmesini sağlamasıdır; örneğin, cdbir sembolik bağlantıya girerken, bash , çekirdek aksini düşünmese bile, beklediğiniz yolu gösterecektir. "Hata", bash'ın// onu kullanmayan sistemlerde bile izin vermesidir .


İlginçtir, zshizin verir cd //, ancak sadece /bilgi istemi dizesinde gösterilecek kadar akıllıdır .
yeni123456

@BinaryZebra Bitsavers, Apollo's dahil olmak üzere eski Unix kılavuzlarından oluşan bir koleksiyona sahiptir - orada çok sayıda örnek olmalıdır. TUHS web sitesinde de bir şey olmalı.
user1686

Çok teşekkürler, // için açıklamayı Bitsavers kılavuzunda buldum.

9

POSIX yol adı tanımından:

Bir yol adı isteğe bağlı olarak bir veya daha fazla eğik çizgi içerebilir. Birden fazla ardışık eğik çizgi, bir eğik çizgi ile aynı kabul edilir.

Kaynak

Ve daha doğrusu , Pathname Resolution ile ilgili 4.11 bölümündeki aşağıdaki yorumunda yer alan ağırlık gibi :

İ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.


1
Daha doğru bölümdür 4.11 Pathname Çözünürlük söz konusu davranışı sadece iki görünür, çünkü (son paragraf) önde gelen eğik çizgiler.
user1686

3

Bu bir tür özellik. Kabuk komut dosyası kullanılıp kullanılıyorsa find, örneğin tüm yolların önüne genellikle ./ eklenir. Daha sonra, bunu gerçek bir yola bağlarsanız, / my / path / appended / path dizinine giden /my/path/./appended/path haline gelir. Eğer yanılmıyorsam, // get /./ ve dolayısıyla / olarak yorumlanır. Bu, / home / user // 'a gittiğinizde / home / user /


1

Ben "hata" görüntüleme istemi için gider.

Her iki "/", "//", "//////////////////////", ... yolları aynı anlama gelir: "/". Unix yoluna istediğiniz yere "/" ekleyebilirsiniz, bu anlamını değiştirmez.

"Hata" daha fazla bilgi istemi gerçek "pwd" değil, görüntüleme yolunda son yazılan geçerli geçerli kullanmak gerçeği ile ilgilidir.

Yine de komik;)


Kabul edildi - bilgi //isteminde bilgi istemi ortam değişkeninizin ( $PS1) bir yan etkisi var - nasıl PS1tanımlanır?
Doug Harris

@DougHarris $PS1değişkeni olarak tanımlanır [\u@\h \W]\$. Ayarla ilgili bir sorun mu var?
Summer_More_More_Tea

Garip. Bu PS1'i denersem, sadece /pwd = olduğunda bir tane alırım /. Dizini almak için ekstra bir iş yapıp yapmadığınızı merak ettim. Ayarlandı mı $PROMPT_COMMAND?
Doug Harris

@DougHarris Evet, değeri olan bu değişken ayarlanır echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Lütfen biraz ayrıntılı olarak açıklayabilir misiniz? Bu iki değişkene pek aşina değilim. Teşekkürler.
Summer_More_More_Tea

Bash man sayfasını oku ve komut satırında arama PS1ve PROMPT_COMMANDkullanma man bashya da online okuma
Doug Harris

1

Onun bir Özelliği ve tüm çoklu // tek bir /

Sonunda örnek gibi yolları olan değişkenleriniz varsa kullanışlıdır. Böylece cd'niz herhangi bir hata almaz ve çalışma alanı değişkenini değiştirmeniz gerekmez.

MY_WORKSPACE = / home / kullanıcı adınız / çalışma alanı /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

proje değişkeninin tüm içeriği

/ Home / kullanıcı_adınız / çalışma alanı // my_proj /

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.