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?
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?
Yanıtlar:
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, $HOME
var seçeneğini kullanmanız veya iki cd
s 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.
~
yapmaktır cd ~user/download
bir kullanıcının indirme dizinine gidin.
Yapmak cd
temelde cd
hiç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, HOME
ortam 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, cd
tek 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 cd
ama ~
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, HOME
boş dize oluşturmanın hem tilde hem de cd
davranışı bozduğunu görebilirsiniz .
Tilde ve $HOME
biraz farklı ve varoluş sebebi var. $HOME
aynı 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 tilde
için wordexp()
işlevi kullanabilmenize rağmen, tilde genişletme gerçekleştiren kabuğa özgü sözdizimidir .
Nedeni ~
temsil HOME
yanıtlandı bu soruya Bir zamanlar yaklaşık işareti karakteri ile aynı anahtarı paylaştı kez: HOME
Lear-Siegler ADM-3A terminalinde. HOME
aksine, tamamen sembolik anlamı olan ve fiziksel temsili olmayan ortam değişkenidir.
Ek olarak, HOME
bir 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
echo
Unset 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ı HOME
etkiler ~
:
$ 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 PWD
ve HOME
aynı 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
,, dash
ve csh
- hepsi cd
veya 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ü.
Ne olursa olsun birkaç klasör altında veya üstünde seviyeleri olup olmadığını $HOME
, komutlar cd
ve 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 $HOME
bir yazarken cd
komutu. Ö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
~ / 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.
root
adlı kişinin dizini genellikle dışında/home
cd ~
vscd $HOME
vs hakkında soruyorcd ~not-tandu
. Bu sorucd
vs hakkında soruyorcd ~
.