'Cd' ve 'cd ~' arasındaki fark


11

Merak ediyorum, eğer cd sadece beni ana klasöre gönderiyorsa ve cd ~ aynısını yapıyorsa , neden ilk etapta ~ eklendi?

BASH'e özgü bir şey mi yoksa başka bir Kabukta farklı mı davranırlar?


2
Kesinlikle bir kopya değil. Bu soru cd ~vs cd $HOMEvs hakkında soruyor cd ~not-tandu. Bu soru cdvs hakkında soruyor cd ~.

Yanıtlar:


17

Bundan ~daha fazlası için kullanılabilir. Herhangi bir komut, giriş klasörüne kısayol kullanmaktan yararlanabilir. Yani evinize cd yazmak istiyorsanız gerekli değil, ama ne olacak ~/.config?

$ cd ~/.config

Aksi takdirde, giriş yolunu yazmanız, $HOMEvar seçeneğini kullanmanız veya iki cds yapmanız gerekir . Ayrıca dosyaları kopyalamak veya taşımak için:

$ cp ~/downloads/some-file some/path/

Dosyalarınızın çoğu evde olduğundan bir kısayol kullanmak her zaman iyidir.


Merhaba ahilsend, aslında benim sorum neden 2 yolu daha odaklı. Ben zaten ~ HOME değişkenini kullanarak ~ biliyorum, ama, bu zihin ile, neden "CD" tek başına da beni eve gönderir. Aynı amaç için neden 2 yol?
Luis Alvarado

4
@CYREX Tahminim, ana dizininize gitmek istemenin en yaygın durumu için yazmayı kaydetmek olacaktır.
CVn

1
Diğer kullanımı ~yapmaktır cd ~user/downloadbir kullanıcının indirme dizinine gidin.
ott--

5

Yapmak cd temelde cdhiçbir argüman olmadan çağırır ve cd"... dir sağlanmazsa, HOME kabuk değişkeninin değeri varsayılan değerdir." ( bash kılavuzundan ). Buna karşılık, komuta cd ~argüman sağladığınızda cd, ~kabuk olur ve kabuk tilde genişletme gerçekleştirir . Kullanıcının ana dizinine geri döndükçe - hiçbir fark yok. Her iki durumda da, HOMEortam değişkeni sorgulanır:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

Etkili olarak, bunun da hiçbir farkı yoktur cd $HOME. Ancak, cdtek ve tek bir şey yaparken , tilde, ~+geçerli çalışma dizini gibi diğer genişletmeleri gerçekleştirmek için kullanılabilir .

Ancak, ilginç bir unset HOMEşekilde kırılabiliriz cdama ~yine de çalışacağız:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Neden ? Yine, kılavuzda cevap verin:

HOME ayarlanmamışsa, kabuğu çalıştıran kullanıcının giriş dizini onun yerine kullanılır. Aksi takdirde, tilde öneki belirtilen giriş adıyla ilişkili giriş dizini ile değiştirilir.

Ayarsızlığın, boş değişken oluşturmanın HOME=ve etkisi olandan farklı olduğuna dikkat edin . Belgeler özellikle ayarsız değişken hakkında konuşuyor. Değişkeni boş dizeye eşit yapmak, beklediğimizden farklı bir etkiye sahiptir:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Burada, HOMEboş dize oluşturmanın hem tilde hem de cddavranışı bozduğunu görebilirsiniz .


Tilde ve $HOMEbiraz farklı ve varoluş sebebi var. $HOMEaynı zamanda ortam değişkenlerinden biri olarak rastlantısal olarak meydana gelen ve tüm programlar için kullanılabilen bir kabuk değişkenidir; C'de buna environ()erişmek için kullanabilirsiniz . Buna karşılık, C'de kabuk benzeri genişletme ( referans ) gerçekleştirmek tildeiçin wordexp()işlevi kullanabilmenize rağmen, tilde genişletme gerçekleştiren kabuğa özgü sözdizimidir .

Nedeni ~temsil HOMEyanıtlandı bu soruya Bir zamanlar yaklaşık işareti karakteri ile aynı anahtarı paylaştı kez: HOMELear-Siegler ADM-3A terminalinde. HOMEaksine, tamamen sembolik anlamı olan ve fiziksel temsili olmayan ortam değişkenidir.

Ek olarak, HOMEbir ortam değişkeni olması, ~basit bir yolla başka bir şeye ayarlayamadığımızdan, onu ayarlamamıza izin verir .

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

echoUnset değişkeninin ilk çıktısını aldığı boş satıra ve bunun olduğu gerçeğine dikkat edin. Buna karşılık, tilde yapmak için böyle şeyler yapamayız:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

Ancak, değiştirme şunları HOMEetkiler ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Ayrıca, ~genişletme karakteri olarak da çalıştığı için, geçerli çalışma dizinini göstermek için böyle şeyler yapabiliriz:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Eğer bunu ortam değişkenleri aracılığıyla yapmak istiyorsak, buna ihtiyacımız var PWDve HOMEaynı kalıyor, ya da böyle şeyler yaparsanız echo $HOME+- bu sadece string / değişken birleştirme. Fakat yine de, ~+bilgiyi ortam değişkenlerinden çıkarır:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

NOT : ~+ve ~-genişletmeleri içinde çalışır ksh, ancak içinde çalışmaz dash.


Bazı sorularınızı cevaplamak için:

BASH'e özgü bir şey mi yoksa başka bir Kabukta farklı mı davranırlar?

Hayır, bu tutarlı bir davranış olmalıdır. ksh,, dashve csh- hepsi cdveya ile aynı şekilde davranır cd ~.

~ neden ilk etapta eklendi?

Tilde ile ilgili cevapta açıklandığı gibi kolaylık ve tarihi nedenler söyleyebilirim. Sonunda, sadece ev dizini genişletmekten daha fazlasını yapmak için büyüdü.


0

Ne olursa olsun birkaç klasör altında veya üstünde seviyeleri olup olmadığını $HOME, komutlar cdve cd ~aynı şeyi yapmak ve farklılık yok - sizin ANA dizinine geri gönderecektir.

ANCAK: Eğer EV yukarıdaki 1 veya daha fazla klasör seviyesi vardır ve bir alt dizine 1 veya aşağıda daha klasör seviyelere DOĞRUDAN gitmek isterken $HOME, tilde ( ~) başvurmak için gerekli metni yerine kullanıldığında sizi tuş vuruşlarını kaydederek kullanışlı için $HOMEbir yazarken cdkomutu. Örneğin;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3

0

~ / home / username konumunun kısaltmasıdır, böylece yazarken biraz zaman kazanırsınız. Örneğin cd / home / username / Downloads, cd ~ / Downloads ile aynıdır, ancak daha az yazılır. Her iki komut da aynısını yapar, çalışma dizinini bu konuma değiştirir.


Pek sayılmaz. Eg rootadlı kişinin dizini genellikle dışında/home
Dmitry Grigoryev
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.