Saya tahu ini mungkin telah ditanyakan sebelumnya, tetapi saya tidak dapat menemukannya dengan Google.
Diberikan
- Kernel Linux
- Tidak ada konfigurasi yang mengubah $ HOME
- pesta
Apakah ini ~ == $HOME
benar?
bash
shell
environment-variables
home
PythonNut
sumber
sumber
~
akan setara dengan$HOME
lingkungan POSIX apa pun; tapi saya bisa saja salah.echo "~"
danecho "$HOME"
.~
atau$HOME
. : P~
".) Bagaimanapun, sesuatu yang perlu diingat oleh pembaca biasa, seperti saya.Jawaban:
Yang penting untuk dipahami adalah bahwa
~
ekspansi adalah fitur dari shell (dari beberapa shell), itu bukan karakter ajaib daripada berarti direktori home Anda di mana pun ia digunakan.Itu diperluas (oleh shell, yang merupakan aplikasi yang digunakan untuk menafsirkan baris perintah), seperti
$var
diperluas ke nilainya dalam beberapa kondisi ketika digunakan dalam baris perintah shell sebelum perintah dieksekusi.Fitur itu pertama kali muncul di c-shell pada akhir 1970-an (cangkang Bourne tidak memilikinya, pendahulunya juga cangkang Thompson), kemudian ditambahkan ke cangkang Korn (cangkang yang lebih baru dibangun di atas cangkang Bourne di 80-an). Itu akhirnya distandarisasi oleh POSIX dan sekarang tersedia di sebagian besar shell termasuk yang non-POSIX seperti
fish
.Karena itu digunakan secara luas dalam shell, beberapa aplikasi non-shell juga mengenalinya sebagai direktori home. Itulah kasus banyak aplikasi dalam file konfigurasi atau mereka sendiri baris perintah (
mutt
,slrn
,vim
...).bash
khusus (yang merupakan shell dari proyek GNU dan banyak digunakan di banyak sistem operasi berbasis Linux), ketika dipanggil sebagaish
, sebagian besar mengikuti aturan POSIX tentang~
ekspansi, dan di daerah yang tidak ditentukan oleh POSIX, berperilaku seperti shell Korn (dari yang merupakan bagian klon).Sementara
$var
diperluas di sebagian besar tempat (kecuali di dalam tanda kutip tunggal),~
ekspansi, menjadi renungan hanya diperluas dalam beberapa kondisi tertentu.Ini diperluas ketika pada argumennya sendiri dalam konteks daftar, dalam konteks di mana string diharapkan.
Berikut adalah beberapa contoh perluasannya
bash
:cmd arg ~ other arg
var=~
var=x:~:x
(diperlukan oleh POSIX, digunakan untuk variabel sepertiPATH
,MANPATH
...)for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(perluasan~
diambil sebagai pola AT&Tksh
tetapi tidakbash
sejak 4.0).case ~ in ~) ...
${var#~}
(meskipun tidak di beberapa kerang lain)cmd foo=~
(meskipun tidak ketika dipanggil sebagaish
, dan hanya ketika apa yang ada di sebelah kiri=
berbentuk sepertibash
nama variabel yang tidak dikutip )cmd ~/x
(diperlukan oleh POSIX jelas)cmd ~:x
(tapi tidakx:~:x
ataux-~-x
)a[~]=foo; echo "${a[~]} $((a[~]))"
(tidak di beberapa kerang lain)Berikut adalah beberapa contoh di mana itu tidak diperluas:
echo "~" '~'
echo ~@ ~~
(juga perhatikan bahwa~u
ini dimaksudkan untuk memperluas ke direktori home penggunau
).echo @~
(( HOME == ~ ))
,$(( var + ~ ))
extglob
:case $var in @(~|other))...
(meskipuncase $var in ~|other)
tidak masalah)../configure --prefix=~
(karena--prefix
bukan nama variabel yang valid)cmd "foo"=~
(dalambash
, karena tanda kutip).sh
:export "foo"=~
,env JAVA_HOME=~ cmd
...Mengenai apa yang diperluas ke:
~
sendiri diperluas ke kontenHOME
variabel, atau ketika tidak disetel, ke direktori home dari pengguna saat ini dalam basis data akun (sebagai ekstensi karena POSIX membiarkan perilaku tidak terdefinisi).Perlu dicatat bahwa dalam ksh88 dan
bash
versi sebelum 4.0, ekspansi tilde mengalami globbing (pembuatan nama file) dalam konteks daftar:Itu seharusnya tidak menjadi masalah dalam kasus-kasus biasa.
Perhatikan bahwa karena diperluas, peringatan yang sama berlaku sebagai bentuk ekspansi lainnya.
Tidak berfungsi jika
$HOME
dimulai dengan-
atau mengandung..
komponen. Jadi, meskipun sangat kecil kemungkinannya untuk membuat perbedaan, secara tegas, kita harus menulis:Atau bahkan:
(untuk menutupi nilai
$HOME
like-
,+2
...) atau hanya:(seperti
cd
membawa Anda ke direktori home Anda tanpa argumen)Kerang lainnya memiliki
~
ekspansi yang lebih maju . Misalnya, dizsh
, kami memiliki:~4
,~-
,~-2
(Dengan penyelesaian) yang digunakan untuk memperluas direktori dalam direktori stack Anda (tempat Anda sudahcd
sebelum).~something
diperluas.sumber
Dalam semua versi Bash di sistem apa pun, ya .
~
sebagai istilah sendiri didefinisikan untuk diperluas ke:jadi itu akan selalu sama dengan apa pun yang
$HOME
ada pada shell saat ini. Ada beberapa ekspansi tilde lainnya, seperti~user
untukuser
direktori home, tetapi satu tanda kutip~
sendiri akan selalu diperluas ke"$HOME"
.Perhatikan bahwa perilaku dari
~
dan$HOME
dapat berbeda dalam beberapa kasus: pada khususnya, jika$HOME
mengandung spasi (atau lainnya IFS karakter), maka$HOME
(kuotasi) akan diperluas untuk beberapa kata, sementara~
selalu satu kata.~
memperluas ekuivalen untuk"$HOME"
(dikutip).Sehubungan dengan pertanyaan spesifik Anda:
selalu benar, karena
[[
menekan pemisahan kata.[[ ~ == $HOME ]
mungkin tidak jikaHOME
memiliki karakter yang cocok dengan pola di dalamnya, tetapi[[ ~ == "$HOME" ]]
(yaitu, dikutip"$HOME"
) selalu benar. Menggunakannya di dalam tanda kurung tunggal dapat menjadi kesalahan sintaksis untuk nilai yangHOME
berisi spasi atau karakter khusus. Untuk konfigurasi direktori home yang masuk akal~
dan"$HOME"
sama dan bandingkan sebagai sama.Stéphane Chazelas telah mencatat sebuah kasus di komentar di mana
~
dan$HOME
memberikan nilai yang berbeda: jika Andaunset HOME
, maka ketika Anda menggunakan~
Bash akan menelepongetpwuid
untuk membaca nilai dari basis data kata sandi. Kasing ini dikecualikan oleh kondisi Anda yang tidak memiliki konfigurasi berubah$HOME
, tetapi saya akan menyebutkannya di sini untuk kelengkapan.sumber
/bin/sh
mungkin tidakbash
. Saya tidak yakin bahwash
spesifikasi Posix bercerita tentang~
~
.~
tidak ada dalam cangkang Thomson atau Bourne (yang pada waktunya tersedia sebagai/bin/sh
). Itu bukan dalamrc
atau turunannya (di mana ia digunakan untuk sesuatu yang lain)bash
, jikaHOME
tidak disetel,~
memperluas ke direktori home pengguna dari database passwd. Jadi itu adalah kasus di mana~
mungkin tidak berkembang ke nilai$HOME
.bash
sebelum bash4 digunakan untuk melakukan globbing pada ekspansi tilde (cobaHOME='/*' bash -c 'echo /*'
). JadiHOME=/*; [ "$HOME" = ~ ]
akan mengembalikan kesalahan di sana.get_current_user_info
, yang menggunakangetpwuid
pada semua platform tapi Tandem .