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 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 $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 seperti PATH
, MANPATH
...)
for i in ~
[[ ~ = text ]]
[[ text = ~ ]]
(perluasan ~
diambil sebagai pola AT&T ksh
tetapi tidak bash
sejak 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 bash
nama variabel yang tidak dikutip )
cmd ~/x
(diperlukan oleh POSIX jelas)
cmd ~:x
(tapi tidak x:~:x
atau 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 ~u
ini 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 --prefix
bukan 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 HOME
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:
$ 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 $HOME
dimulai 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 $HOME
like -
, +2
...) atau hanya:
cd
(seperti cd
membawa 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 cd
sebelum).
- direktori bernama dinamis . Anda dapat menentukan mekanisme Anda sendiri untuk memutuskan bagaimana
~something
diperluas.
~
akan setara dengan$HOME
lingkungan POSIX apa pun; tapi saya bisa saja salah.