Saya tahu ini mungkin pernah ditanyakan sebelumnya, tetapi saya tidak dapat menemukannya dengan Google.
Diberikan
- Kernel Linux
- Tidak ada konfigurasi yang mengubah $HOME
- bash
Akankah ~ == $HOME
benarkah?
Jawaban yang Diterima:
Yang penting untuk dipahami adalah ~
ekspansi adalah fitur shell (dari beberapa shell), itu bukan karakter ajaib daripada berarti direktori home Anda di mana pun digunakan.
Itu diperluas (oleh shell, yang merupakan aplikasi yang digunakan untuk menafsirkan baris perintah), seperti $var
diperluas ke nilainya dalam beberapa kondisi saat digunakan dalam baris perintah shell sebelum perintah dijalankan.
Fitur itu pertama kali muncul di cangkang C pada akhir 1970-an (cangkang Bourne tidak memilikinya, begitu pula pendahulunya 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 digunakan secara luas di shell, beberapa aplikasi non-shell juga mengenalinya sebagai direktori home. Itulah yang terjadi pada banyak aplikasi dalam file konfigurasinya atau miliknya 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 area yang tidak ditentukan oleh POSIX, sebagian besar berperilaku seperti cangkang Korn (yang merupakan tiruan bagian).
Sementara $var
diperluas di sebagian besar tempat (kecuali di dalam tanda kutip tunggal), ~
ekspansi, menjadi renungan hanya diperluas dalam beberapa kondisi tertentu.
Itu diperluas ketika pada argumennya sendiri dalam konteks daftar, dalam konteks di mana string diharapkan.
Berikut adalah beberapa contoh di mana itu diperluas di 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 di AT&Tksh
tapi bukanbash
sejak 4.0).case ~ in ~) ...
${var#~}
(meskipun tidak di beberapa shell lain)cmd foo=~
(meskipun tidak ketika dipanggil sebagaish
, dan hanya jika yang ada di sebelah kiri=
berbentuk sepertibash
yang tidak dikutip nama variabel)cmd ~/x
(jelas diperlukan oleh POSIX)cmd ~:x
(tetapi bukanx:~:x
ataux-~-x
)a[~]=foo; echo "${a[~]} $((a[~]))"
(tidak di beberapa shell lain)
Berikut adalah beberapa contoh yang tidak diperluas:
echo "~" '~'
echo [email protected] ~~
(perhatikan juga bahwa~u
dimaksudkan untuk memperluas ke direktori home penggunau
).echo @~
(( HOME == ~ ))
,$(( var + ~ ))
- dengan
extglob
:case $var in @(~|other))...
(meskipuncase $var in ~|other)
tidak apa-apa). ./configure --prefix=~
(sebagai--prefix
bukan nama variabel yang valid)cmd "foo"=~
(dibash
, karena tanda kutip).- ketika dipanggil sebagai
sh
:export "foo"=~
,env JAVA_HOME=~ cmd
…
Seperti apa perluasannya:~
sendiri memperluas konten HOME
variabel, atau bila tidak disetel, ke direktori home pengguna saat ini di database akun (sebagai ekstensi karena POSIX membiarkan perilaku itu tidak ditentukan).
Perlu dicatat bahwa di 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 biasa.
Perhatikan bahwa karena diperluas, peringatan yang sama berlaku seperti bentuk perluasan lainnya.
cd ~
Tidak berfungsi jika $HOME
dimulai dengan -
atau berisi ..
komponen. Jadi, meskipun sangat kecil kemungkinannya untuk membuat perbedaan, secara tegas, orang harus menulis:
cd -P -- ~
Atau bahkan:
case ~ in
(/*) cd -P ~;;
(*) d=~; cd -P "./$d";;
esac
(untuk menutupi nilai $HOME
seperti -
, +2
…) atau cukup:
cd
(sebagai cd
membawa Anda ke direktori home Anda tanpa argumen apapun)
Kerang lain memiliki ~
yang lebih canggih ekspansi. Misalnya, di zsh
, kami memiliki:
~4
,~-
,~-2
(dengan selesai) digunakan untuk memperluas direktori di tumpukan direktori Anda (tempat Andacd
ke sebelumnya).- direktori bernama dinamis . Anda dapat menentukan mekanisme Anda sendiri untuk memutuskan bagaimana
~something
sedang diperluas.