Perbedaan antara $ HOME dan ~

31

$HOMEdan ~biasanya merujuk pada hal yang sama. Yaitu, mereka adalah path ke direktori "home user" yang berbentuk umum "/ home / userName".

Kapan, jika pernah, apakah ini tidak merujuk ke direktori yang sama?

H2ONaCl
sumber
11
Ini ~tergantung shell sedangkan $ HOME tidak.
Kulfy
Sangat terkait unix.stackexchange.com/a/400715/85039
Sergiy Kolodyazhnyy

Jawaban:

45

Keduanya $HOMEdan ~menunjuk ke folder yang sama, folder home pengguna saat ini, tetapi keduanya adalah hal yang sangat berbeda.

  • $HOMEadalah variabel lingkungan , yang diatur untuk berisi folder beranda pengguna saat ini.
  • ~adalah simbol ekspansi shell , yaitu, salah satu simbol yang diproses sebelum perintah yang sebenarnya dilakukan. ~sendiri memperluas ke nilai $ HOME. ~nemomemperluas ke direktori home pengguna nemo. Simbol ekspansi shell adalah karakter (atau pasangan karakter) yang diproses / ditafsirkan oleh shell untuk membangun perintah aktual. Contoh lain dari simbol ekspansi shell adalah *, yang digunakan untuk memperluas nama file.
vanadium
sumber
1
~meluas ke $ HOME, atau% APPDATA% di Windows. Jika tidak ditentukan, ia akan mencari jalur di "basis data kata sandi" (yang biasanya berarti /etc/passwd, tetapi mungkin LDAP atau sumber data lainnya). Sekitar 20 tahun yang lalu Anda mungkin telah diperingatkan bahwa $ HOME mungkin tidak disetel pada beberapa mesin, sementara ~dijamin akan meluas ke sesuatu.
Mirek Długosz
Perbedaan ini penting dalam program-program seperti make, ketika Anda perlu tahu yang mana dari dua yang Anda butuhkan
D. Ben Knoble
3
@ MirekDługosz Setidaknya pada git bash pada Windows, ~perluas $HOME(sama dengan $HOMEPATH), tidak $APPDATA. Dan pada cmd.exe, ~tidak berkembang.
hyde
1
@vanadium HOMEadalah variabel lingkungan (konsep OS, di sh kerang misalnya set dengan exportatau declare -x), bukan variabel shell (definisi yang tergantung sepenuhnya pada shell, tapi di sh kerang itu biasanya diatur dengan foo=valueatau dengan setatau dalam beberapa lainnya cara).
hyde
1
@ Hyde, saya salah mengartikannya. bash akan memeriksa $ HOME, jika tidak disetel akan memeriksa% APPDATA%, tetapi hanya di Windows; jika tidak disetel, itu akan mencari "basis data kata sandi". Lihat git.savannah.gnu.org/cgit/bash.git/tree/lib/readline/…
Mirek Długosz
17

Satu cara mereka berbeda adalah dalam bagaimana shell Bash mengkonversikan mereka ketika tertutup dalam "jenis tanda kutip.

Jika Anda menggunakan echoseperti ini, tanpa tanda kutip, maka ~dan $HOMEmemiliki efek yang sama:

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

Namun, dengan "tanda kutip di sekitar mereka, hasilnya berbeda:

$ echo "~"
~
$ echo "$HOME"
/home/elias
Elias
sumber
13

~hanya mengembang sebagai bagian dari awalan tilde yang menurut definisi harus dimulai pada awal kata. Selain itu, karena pernah menjadi bagian dari pola globbing, ~tidak akan bekerja di dalam tanda kutip ganda. Jadi, "~"atau a~bakan menghasilkan nilai literal dari ~dilestarikan.

Satu ~(atau ~diikuti oleh a /) akan diperluas ke rumah pengguna saat ini:

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

Yang ~diikuti oleh nama pengguna akan diperluas ke folder beranda pengguna itu:

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

Yang ~diikuti oleh a +atau a -dan nomor opsional akan diperluas ke elemen tumpukan direktori :

$ cd /etc
$ echo ~+0
/etc

$HOMEadalah ekuivalen dari satu ~, yang sebaliknya mengikuti aturan sintaks untuk variabel. Sebagai contoh, itu berkembang di dalam tanda kutip ganda, bisa tidak disetel, dan operan manipulasi string dapat diterapkan untuk itu.

Dmitry Grigoryev
sumber
3

Ini sangat tergantung pada apa yang dilakukan ekspansi. Dalam bash, ~adalah cara mudah untuk mendapatkan direktori home tanpa memicu ekspansi nama file atau pemisahan kata meskipun tidak dikutip. Sebagai contoh:

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

Atau:

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

Jadi, jika Anda bergulat dengan kutipan karena suatu alasan (dalam hal ini Anda harus benar-benar memikirkan kembali semuanya, lebih mudah untuk bergulat babi), ~mungkin lebih nyaman.


Di tempat lain, dalam Python, misalnya, ~dan $HOMEharus diperluas dengan berbagai fungsi . Beberapa tempat lain mengizinkan variabel dan tidak mengizinkan sintaks shell lain seperti wildcard atau ekspansi tilde (mis. ~/.pam_environment, Yang memiliki sintaks khusus untuk ekspansi variabel). Namun tempat-tempat lain memungkinkan ekspansi tilde sebagai pengecualian (misalnya, systemd ), tetapi meminta database passwd langsung daripada menggunakan $HOME.

homeboy
sumber
Perbedaan besar lainnya, yang Anda tunjukkan di sini, tetapi tidak disebutkan, adalah bahwa Anda dapat mengubah nilai $HOME, tetapi Anda tidak dapat (secara langsung) mengubah nilai ~.
Joe
Jadi saya bertanya kapan $HOMEdan ~tidak merujuk ke hal yang sama - biasanya mereka lakukan secara default - dan kemudian Anda sengaja menetapkan variabel lingkungan untuk membuat mereka tidak merujuk ke hal yang sama. Ini adalah demonstrasi yang bagus tapi membingungkan.
H2ONaCl
1

$ HOME / lebih mungkin untuk bekerja di POSIX.2 standar. Bourne / bin / sh karena ekspansi tilde adalah ekstensi yang ditemukan di BSD csh tcsh GNU bash dan lainnya.

Jika Anda ingin menulis skrip portabel ke busybox atau dash atau BSD sh, berinvestasilah dalam surat-surat tambahan jangan sampai Anda crash ~ /: Tidak ada file atau direktori pada sistem tertentu.

Saya juga menemukan $ HOME / lebih mudah dibaca.

Roman Czyborra
sumber
Dalam skrip, keterbacaan dan visibilitas adalah penting. Mungkin ini sebabnya skrip saya digunakan $HOMEdan jarang digunakan ~. Mantan diriku mungkin tahu ini.
H2ONaCl