“Cd -” ve “cd ~ -” arasındaki fark


56

Bash komutu

cd - 

önceden kullanılan dizini yazdırır ve dizine değiştirir.

Öte yandan, Bash komutu

cd ~-

hiçbir şey yankılanmadan, önceden kullanılan dizine doğrudan geçer.

Tek fark bu mu? Her komutun kullanım durumu nedir?


3
Bu zor şeylerin hiçbirini kullanmamanı tavsiye ederim. Bu senin beynin cd ~-.
DepressedDaniel

10
@DepressedDaniel, zorlu şeyler kullanmasanız (planlama yapmasanız bile), sahnelerin ardında neler olduğunu anlamakta fayda var - köşe davalarını anlamak, daha sonra farklı bir şeyi ayıklamaya çalışırken sizi bir delikten çıkarabilir.
başka bir gün

Yanıtlar:


81

Burada oyunda iki şey var. İlk olarak, -yalnız önceki dizine genişletilir. Bu, (benim vurgulanan) cdbölümünde açıklanmaktadır man bash:

-Dizini değiştirmeden önce bir argüman $ OLDPWD'ye dönüştürülür. CDPATH'den boş olmayan bir dizin adı kullanılıyorsa veya -ilk bağımsız değişkense ve dizin değişikliği başarılıysa, yeni çalışma dizininin mutlak adı standart çıktıya yazılır. Dizin başarıyla değiştirildiyse dönüş değeri geçerlidir; aksi takdirde yanlış.

Bu yüzden basit cd -, sizi önceki dizininize geri götürecek ve yönetmenin ismini yazdıracaktır. Diğer komut "Tilde Expansion" bölümünde belgelenmiştir:

Tilde öneki a ise ~+, PWD kabuk değişkeninin değeri tilde öneki yerine geçer. Tilde-öneki a ise ~-, eğer ayarlanmışsa OLDPWD kabuk değişkeninin değeri kullanılır. Tilde önekindeki tilde izleyen karakterler, isteğe bağlı olarak a +veya a -ile ön eklenmiş bir N sayısından oluşuyorsa , tilde öneki, dizine yerleştirilen direkler tarafından görüntüleneceği gibi, dizin yığındaki karşılık gelen öğeyle değiştirilir. tilde-öneki argümanı olarak. Tilde önekindeki tilde takip eden karakterler, baştaki olmayan bir sayıdan oluşuyorsa +veya -, +varsayılırsa.

Bunu bir örnekle anlamak daha kolay olabilir:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

Yani, genel olarak, -"önceki dizin" anlamına gelir. Bu yüzden cd -, kendi başına, seni olduğun yere geri götürecek.

En büyük fark, yerleşik yapıya cd -özgüdür cd. Eğer denersen echo -sadece a -. ~-Yaklaşık yorumlaması işlevselliği bir parçasıdır ve bir değişkene benzer şekilde davranır. Bu yüzden echo ~-anlamlı bir şeyler elde edip edinebilirsiniz. Ayrıca içinde kullanabilirsiniz, cd ~-ancak herhangi bir komutta da kullanabilirsiniz. Örneğin cp ~-/* ., buna eşdeğer olacaktırcp "$OLDPWD"/* .


1
set -xÇalıştırılmadan önce genişletilmiş komutu yazdırmak için farkı göstermek yararlı olabilir (veya bir seferde bir adım kendiniz yapmıyorsanız okunaksız derecede gürültülü olabilir).
Peter Cordes

1
@ terdon bugün öğrendim.
sitilge

Kısacası ... cd ~-/..çalışır, cd -/..olmaz!
Ray Foss

13

~-tilde genişlemesine maruz kalır (bkz. man bash), yani ne cdgörürse doğrudan önceki dizin adı olur. -kabuk tarafından genişlemez, cddoğrudan görür ve belgelendiği gibi davranır:

- argümanı $ OLDPWD'ye eşittir. CDPATH'den boş olmayan bir dizin adı kullanılırsa veya - ilk argümansa - ve dizin değişikliği başarılıysa, yeni çalışma dizininin mutlak adı standart çıktıya yazılır.


4

TL; DR: cd -yerleşiktir cd, ~-daha ileri bir uzantısıdır ~[name], özgü değildir cd.

POSIX.1-2008 Shell & Utilities , komuta özgücd - özel bir durum olarak tanımlar :cd

A -işlenen olarak kullanıldığında, bu komut ile aynı olacaktır:

cd "$OLDPWD" && pwd

önceki çalışma dizini değişir ve sonra adını yazar.

~-Uzatma genişletilmiş olacak $OLDPWDherhangi komut çalıştırılmadan önce ve sadece herhangi bir komut için bir argüman olarak geçirilebilir cd. Bu bir sonraki uzantısıdır ve .

Yukarıda bahsedilen POSIX.1-2008 Shell & Utilities standardı , Tilde Expansion'ın ayrıntılı bir açıklamasını da içermektedir . Üslup sağlamak için çok özel olan ~-standart kapsamında olarak tanımlanmamış davranışı ~[name]ifade eder $HOME, eğer [name]boş dize veya kullanıcının ana dizinidir nameeğer namegeçerli bir kullanıcı adıdır.

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.