$ HOME ve ~ arasındaki fark


Yanıtlar:


45

Hem $HOMEve ~aynı klasörde, geçerli kullanıcının ev klasörüne gelin ama ikisi de çok farklı şeylerdir.

  • $HOMEbir ortam değişkenigeçerli kullanıcının ana klasörünü içerecek şekilde ayarlanmış .
  • ~bir kabuk genleşme sembolüdür , yani, gerçek komut gerçekleştirilmeden önce işlenen sembollerden biridir. ~tek başına $ HOME değerine genişler. ~nemokullanıcının giriş dizinine genişler nemo. Bir kabuk genişletme sembolü, gerçek komutu oluşturmak için kabuk tarafından işlenen / yorumlanan bir karakterdir (veya bir çift karakter). *Dosya adlarını genişletmek için kullanılan kabuk genişletme sembolünün bir başka örneği .

1
~Windows'ta $ HOME veya% APPDATA% olarak genişler. Tanımlanmamışlarsa, "şifre veritabanı" ndaki yolu arayacaktır (bu genellikle /etc/passwdLDAP veya başka bir veri kaynağı olabilir). Yaklaşık 20 yıl önce, $ HOME'un bazı makinelere kurulmayacağı, ancak bir ~şeylere genişletilmesi garanti edildiğine dair uyarılmış olabilirsiniz .
Mirek Długosz

İhtiyacınız olan ikisinden hangisini bilmeniz gerektiğinde, make gibi programlarda bu fark dikkat çekicidir
D. Ben Knoble

3
@ MirekDługosz En azından Windows'ta git bash'ta değil (eşit) e ~genişler . Ve cmd.exe üzerinde genişlemez. $HOME$HOMEPATH$APPDATA~
Hyde

1
@vanadium HOME(bir işletim sistemi kavramı, bir ortam değişkendir sh ile, örneğin set kabuğu exportya da declare -x) değil, tamamen kabuk bağlıdır tanımı olan bir kabuk değişkeni (ama içinde sh kabukları genellikle ayarlanır foo=valueveya setya da birkaç diğer yolları).
Hyde

1
@hyde Bunu yanlış ifade ettim. bash $ HOME değerini, ayarlanmadığında% APPDATA% değerini kontrol eder, ancak yalnızca Windows'ta kontrol eder; ayarlanmadıysa, "parola veritabanı" nı arayacaktır. Bkz git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/...
Mirek Dlugosz

17

Farklı olmalarının bir yolu, Bash kabuğunun içine alındığında onları nasıl dönüştürdüğüdür. " tırnak işareti .

Eğer kullanırsanız echo, daha sonra herhangi bir tırnak işaretleri olmadan, böyle ~ve $HOMEaynı etkiye sahiptir:

$ echo ~
/home/elias
$ echo $HOME
/home/elias

Bununla birlikte, "etraflarındaki tırnak işaretleri ile sonuç farklılık gösterir:

$ echo "~"
~
$ echo "$HOME"
/home/elias

13

~yalnızca, tanımı gereği kelimenin başlangıcında başlaması gereken bir tilde öneki parçası olarak genişler . Ek olarak, bir zamanlar küreselleşme kalıplarının bir parçası olduğundan, ~çift ​​tırnak içinde çalışmayacaktır. Yani, "~"veyaa~b bir edebi değeri ile sonuçlanacaktır ~korunmuştur.

Biri ~(veya ~ardından a /), mevcut kullanıcının evine genişler:

$ echo ~/.ssh
/home/user/.ssh

Bir ~kullanıcı adı tarafından takip edilen o kullanıcının ana klasörüne genişler:

$ echo ~root/.ssh
/root/.ssh

A veya a ve ~ardından isteğe bağlı bir sayı, dizin yığınının öğelerine genişler :+-

$ cd /etc
$ echo ~+0
/etc

$HOMETek bir eşdeğeridir ~, bunun yerine değişkenler için sözdizimi kurallarını izler. Örneğin, çift tırnak içinde genişler, ayarlanamaz ve dize işleme işlenenleri uygulanabilir.


3

Bu, genişlemenin ne olduğuna çok bağlıdır. Kısaca, ~dosya dizini genişletmesini veya kelime ayrılmamasına rağmen kelime bölmesini tetiklemeden ana dizini almanın uygun bir yoludur. Örneğin:

$ HOME='/*'
$ echo $HOME
/bin /boot /dev /etc /home /lib /lib64 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var
$ echo ~
/*

Veya:

$ HOME='/ a b'
$ printf "|%s|\n" $HOME ~
|/|
|a|
|b|
|/ a b|

Bu nedenle, bazı nedenlerden dolayı alıntılarla güreşiyorsanız (bu durumda her şeyi gerçekten yeniden düşünmelisiniz, domuz güreşi yapmak daha kolaydır), ~daha uygun olabilir.


Başka yerlerde, örneğin Python'da ~ve farklı işlevlerle$HOME genişletilmesi gerekiyor . Diğer bazı yerler değişkenlere izin verir ve joker karakterler veya tilde genişlemesi gibi diğer kabuk sözdizimlerine izin vermez (ör . Değişken genişlemesi için özel bir sözdizimi vardır). Yine de diğer yerler, bir istisna olarak tilde genişlemesine izin veriyor (örneğin, systemd ), ancak passwd veritabanını kullanmak yerine doğrudan sorgula . ~/.pam_environment$HOME


Burada gösterdiğiniz fakat bahsetmediğiniz bir diğer büyük fark, değerini değiştirebilmenizdir $HOME, ancak değerini (doğrudan) değiştiremezsiniz ~.
Joe,

Ben ne zaman sordum Yani $HOMEve ~normalde varsayılan olarak yapmak - - aynı kapıya ilgili değildir ve sonra ortam değişkeni kasten atama onları aynı şey atıfta yapmak. Bu iyi bir gösteri ancak gereksiz yere kafa karıştırıcı.
H2ONaCl

1

$ HOME / standart POSIX.2'de çalışma olasılığı daha yüksektir çünkü Bourne / bin / sh, tilde genişlemesi BSD csh tcsh GNU bash ve diğerlerinde bulunan bir uzantıdır.

Meşgul kutusuna veya kısa çizgi veya BSD sh'a taşınabilir komut dosyaları yazmak istiyorsanız, ~ / ile çarpmanızın gerekebileceği fazladan harflere yatırım yapın: Belirli sistemlerde böyle bir dosya veya dizin yok.

Ayrıca $ HOME / daha okunabilir buluyorum.


Bir komut dosyasında okunabilirlik ve görünürlük önemlidir. Belki de bu yüzden senaryolarım kullanıyor $HOMEve nadiren kullanıyor ~. Eski özüm muhtemelen bunu biliyordu.
H2ONaCl
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.