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 $vardiperluas 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...).
bashkhusus (yang merupakan shell dari proyek GNU dan banyak digunakan di banyak sistem operasi berbasis Linux), ketika dipanggil sebagai sh, 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 $vardiperluas 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 seperti PATH, MANPATH...)
for i in ~
[[ ~ = text ]]
[[ text = ~ ]](perluasan ~diambil sebagai pola AT&T kshtetapi tidak bashsejak 4.0).
case ~ in ~) ...
${var#~} (meskipun tidak di beberapa kerang lain)
cmd foo=~(meskipun tidak ketika dipanggil sebagai sh, dan hanya ketika apa yang ada di sebelah kiri =berbentuk seperti bashnama variabel yang tidak dikutip )
cmd ~/x (diperlukan oleh POSIX jelas)
cmd ~:x(tapi tidak x:~:xatau x-~-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 ~uini dimaksudkan untuk memperluas ke direktori home pengguna u).
echo @~
(( HOME == ~ )), $(( var + ~ ))
- dengan
extglob: case $var in @(~|other))...(meskipun case $var in ~|other)tidak masalah).
./configure --prefix=~(karena --prefixbukan nama variabel yang valid)
cmd "foo"=~(dalam bash, karena tanda kutip).
- ketika dipanggil sebagai
sh: export "foo"=~, env JAVA_HOME=~ cmd...
Mengenai apa yang diperluas ke: ~sendiri diperluas ke konten HOMEvariabel, 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 bashversi sebelum 4.0, ekspansi tilde mengalami globbing (pembuatan nama file) dalam konteks daftar:
$ bash -c 'echo "$HOME"'
/home/***stephane***
$ bash -c 'echo ~'
/home/***stephane*** /home/stephane
$ bash -c 'echo "~"'
~
Itu seharusnya tidak menjadi masalah dalam kasus-kasus biasa.
Perhatikan bahwa karena diperluas, peringatan yang sama berlaku sebagai bentuk ekspansi lainnya.
cd ~
Tidak berfungsi jika $HOMEdimulai dengan -atau mengandung ..komponen. Jadi, meskipun sangat kecil kemungkinannya untuk membuat perbedaan, secara tegas, kita harus menulis:
cd -P -- ~
Atau bahkan:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(untuk menutupi nilai $HOMElike -, +2...) atau hanya:
cd
(seperti cdmembawa Anda ke direktori home Anda tanpa argumen)
Kerang lainnya memiliki ~ekspansi yang lebih maju . Misalnya, di zsh, kami memiliki:
~4, ~-, ~-2(Dengan penyelesaian) yang digunakan untuk memperluas direktori dalam direktori stack Anda (tempat Anda sudah cdsebelum).
- direktori bernama dinamis . Anda dapat menentukan mekanisme Anda sendiri untuk memutuskan bagaimana
~somethingdiperluas.
~akan setara dengan$HOMElingkungan POSIX apa pun; tapi saya bisa saja salah.