$HOME
dan ~
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?
$HOME
dan ~
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?
Jawaban:
Keduanya $HOME
dan ~
menunjuk ke folder yang sama, folder home pengguna saat ini, tetapi keduanya adalah hal yang sangat berbeda.
$HOME
adalah 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. ~nemo
memperluas 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.~
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.
~
perluas $HOME
(sama dengan $HOMEPATH
), tidak $APPDATA
. Dan pada cmd.exe, ~
tidak berkembang.
HOME
adalah variabel lingkungan (konsep OS, di sh kerang misalnya set dengan export
atau declare -x
), bukan variabel shell (definisi yang tergantung sepenuhnya pada shell, tapi di sh kerang itu biasanya diatur dengan foo=value
atau dengan set
atau dalam beberapa lainnya cara).
Satu cara mereka berbeda adalah dalam bagaimana shell Bash mengkonversikan mereka ketika tertutup dalam "
jenis tanda kutip.
Jika Anda menggunakan echo
seperti ini, tanpa tanda kutip, maka ~
dan $HOME
memiliki efek yang sama:
$ echo ~
/home/elias
$ echo $HOME
/home/elias
Namun, dengan "
tanda kutip di sekitar mereka, hasilnya berbeda:
$ echo "~"
~
$ echo "$HOME"
/home/elias
~
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~b
akan 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
$HOME
adalah 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.
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 $HOME
harus 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
.
$HOME
, tetapi Anda tidak dapat (secara langsung) mengubah nilai ~
.
$HOME
dan ~
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.
$ 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.
$HOME
dan jarang digunakan ~
. Mantan diriku mungkin tahu ini.
~
tergantung shell sedangkan $ HOME tidak.