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?
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?
Yanıtlar:
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"/* .
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).
cd ~-/..çalışır, cd -/..olmaz!
~-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.
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 ksh ve bash .
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.
cd ~-.