~ $ HOME, ama bazen?


15

cd ~

aynı şeyi yapar

cd $HOME

ki aynı

cd /home/tandu

Ancak,

cd ~not-tandu

olarak değişir /home/not-tandu

Bu tamamen sözdizimsel bir seçim mi? Bu, çekirdek (veya yürütülebilir cd) tarafından nasıl ele alınır ~? Demek ki, ~/ve ~aynı dizine değişiklik olmamıştır, ancak ~abir dizin kalmıştır. Aynı durum, değiştirdiğiniz başka herhangi bir dizin için söylenemez.


3
~ Not-tandu ve ~ / not-tandu'yu, bir kullanıcı tandu değil ev dizinini ve diğer noktaları evinizdeki dir not tandu ile karşılaştırmaktan çekinmeyin.
Johan

5
Çekirdek veya "cd yürütülebilir" değil (böyle bir şey olmadığından) - yerleşik bir kabuk.
Paul Tomblin

Bahsetmediğiniz için: cdherhangi bir parametre olmadan gibi çalışır cd ~. Eğer cdile değiştirirseniz echo, ifadenin kabuk tarafından neyin genişletildiğini görebilirsiniz.
Mayıs'ta jofel 17:12

Yanıtlar:


19

~$HOMEbir dizi kabuk tarafından sağlanan bir takma addır, ancak $HOMEdaha evrenseldir. $HOMEaslında kabuktan HOME çevresel değişkenini buraya eklemesini (yerine koymasını) ister. İkame edilebilen çok sayıda farklı çevresel değişken vardır, envbir liste için çalışmayı deneyin . ~Bir sözcüğün başında olmadığı zaman her zaman tanınmayacağını unutmayın . Karşılaştırma için şu iki komutu deneyin:

ls /~
ls /$HOME

Birincisi, ls çalıştırılabilir dosyasına geçirilir ve /~sonra ~kök dizinde çağrılan bir dosyaya bakmaya çalışır , ikincisi genişler $HOMEve //home/usersonra da komut satırı argümanı olarak ls yürütülebilir dosyasına aktarılır. Tüm POSIX sistemleri (POSIX, UNIX ve Linux sistemlerinin nasıl çalıştığı için standarttır), birden fazla eğik çizginin bir eğik çizgi ile aynı şekilde işlenmesine izin verir //home/user, yani aynıdır /home/user. ~usernamekabuğa passwd dosyasındaki kullanıcı adını aramasını ve ana dizinlerini döndürmesini bildiren bir kısayoldur. Eşdeğer bir ortam değişkeni yoktur. Bu ikamelerin tümü kabuk tarafından yapılır ve çoğu tarafından desteklenir, ancak yalnızca gibi ortam değişkenlerinin $HOMEtüm kabuklar tarafından desteklenmesi garanti edilir. Ayrıca,cdaslında yerleşik bir komuttur. Kabuğa dizinleri değiştirmesini söyleyen özel bir yönerge. echoKabuk işleminin temel bir niteliğini değiştirmek için kullanıldığı için ayrı bir yürütülebilir dosya olarak uygulanabilen diğer kabuk yerleşiklerine benzemez . echoyalnızca performans nedenleriyle oluşturulmuş bir kabuktur, ancak UNIX'in eski güzel günlerinde yalnızca kendi yürütülebilir dosyası olarak mevcuttu /bin/echo.


re "daha sonra kök dizinde ~ adlı bir dosyaya bakmaya çalışır"; Bu tüm unix lezzetleri için mi?
Pacerier

17

~foo 'foo kullanıcısı ana dizini' anlamına gelir.

Bu çekirdek tarafından yapılmaz, kabuk tarafından yorumlanır. Kabuk ~foobir argüman olarak gördüğünde , şeffaf bir şekilde kullanıcının ana dizini ile değiştirir foove yerine geçer. Yani koştuğunuzda cd ~tandu, kabuk gerçekten çalışıyor cd /home/tandu.


1
Bu spesifik olarak neyin yerini ve hangi algoritmayı kullanıyor? Yoksa cdkabuk mu? Bir kabuk çalıştırmıyorsanız ne olacak? Basit bir "eğer ~ bir şey izliyorsa, farklı genişleme?" ya da bu eşsiz durum için başka bir özel işlem var mı?
Patlama Hapları

8
Tilde Genişletme hakkındaki Bash kılavuzuna bakın . (Diğer birçok kabuk ve program benzer kurallara
uyar

4
@tandu: kabuk yapar cd, bunu yapmak için harici bir yürütülebilir dosya yoktur (bu mümkün olmaz)
Mat

1
@tandu: Eğer bir kabuk çalıştırmıyorsanız (örneğin bunu kullanarak denemek exec(2)), kabuk genişletme gerçekleşmez. Kabuk genişlemesi olmadan, ~hiçbir şeyle yer değiştirmez - bu sadece mükemmel bir başka geçerli karakterdir. SunOS'un ilk günlerinde bu beni biraz ısırdı çünkü /bin/shgrok etmedi ~.
Alexios

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.