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) cd
bö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 cd
görürse doğrudan önceki dizin adı olur. -
kabuk tarafından genişlemez, cd
doğ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 $OLDPWD
herhangi 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 name
eğer name
geçerli bir kullanıcı adıdır.
cd ~-
.