~ $ HOME, tapi kadang-kadang?

14

cd ~

melakukan hal yang sama dengan

cd $HOME

yang juga sama dengan

cd /home/tandu

Namun,

cd ~not-tandu

berubah menjadi /home/not-tandu

Apakah ini murni pilihan sintaksis? Bagaimana ini ditangani oleh kernel (atau yang dapat cddieksekusi?) Apakah ada kasus khusus untuk ~menambahkan slash jika semuanya dihilangkan? Artinya, ~/dan ~berubah ke direktori yang sama, tetapi ~asatu direktori di atas. Hal yang sama tidak dapat dikatakan untuk direktori lain yang Anda ubah.

Pil Ledakan
sumber
3
Jangan ragu untuk membandingkan ~ bukan-tandu dan ~ / tidak-tandu, satu poin untuk pengguna dir-home tandu dan poin lainnya ke dir-tandu di homedir Anda.
Johan
4
Ini bukan kernel atau "cd executable" (karena tidak ada hal seperti itu) - ini adalah built-in shell.
Paul Tomblin
Karena Anda tidak menyebutkannya: cdtanpa parameter berfungsi seperti cd ~. Jika Anda mengganti cddengan echoAnda dapat melihat apa ekspresi diperluas oleh shell.
jofel

Jawaban:

18

~adalah alias untuk yang $HOMEdisediakan oleh sejumlah shell, tetapi $HOMElebih universal. $HOMEsebenarnya meminta shell untuk memasukkan (mengganti) variabel lingkungan HOME di sini. Ada cukup banyak variabel lingkungan berbeda yang dapat diganti, coba jalankan envuntuk daftar. Catatan yang ~tidak selalu dikenali saat itu tidak di awal kata. Coba dua perintah ini untuk perbandingan:

ls /~
ls /$HOME

Yang pertama dilewatkan ke dieksekusi ls /~yang kemudian mencoba untuk melihat file yang disebut ~di direktori root, yang kedua berkembang $HOMEdan menjadi //home/useryang kemudian diteruskan ke ls dieksekusi sebagai argumen baris perintah. Semua sistem POSIX (POSIX adalah standar untuk bagaimana sistem UNIX dan Linux beroperasi) memungkinkan beberapa garis miring diperlakukan sama dengan satu garis miring sehingga //home/usersama dengan mengatakan /home/user. ~usernameadalah jalan pintas untuk memberi tahu shell untuk mencari nama pengguna dalam file passwd dan mengembalikan direktori home mereka. Tidak ada variabel lingkungan yang setara. Semua penggantian ini dilakukan oleh shell dan didukung oleh sebagian besar dari mereka, tetapi hanya variabel lingkungan seperti $HOMEyang dijamin akan didukung oleh semua shell. Juga,cdsebenarnya adalah perintah bawaan. Ini adalah arahan khusus yang memberitahu shell itu sendiri untuk mengubah direktori. Ini tidak seperti built-in shell lain yang dapat diimplementasikan sebagai executable terpisah echokarena ini digunakan untuk mengubah atribut fundamental dari proses shell. echohanyalah shell built-in untuk alasan kinerja, tetapi di masa lalu yang baik dari UNIX, hanya tersedia karena dapat dieksekusi sendiri /bin/echo.

penguin359
sumber
re "yang kemudian mencoba melihat file bernama ~ di direktori root"; Itu untuk semua rasa unix?
Pacerier
17

~foo berarti 'direktori home dari pengguna foo'.

Ini tidak dilakukan oleh kernel, itu ditafsirkan oleh shell. Setiap kali shell melihat ~foosebagai argumen, itu secara transparan menggantinya dengan direktori home pengguna foodan meneruskannya di tempatnya. Jadi, ketika Anda menjalankan cd ~tandu, shell sebenarnya berjalan cd /home/tandu.

Patrick
sumber
1
Apa yang khusus dilakukan penggantian ini dan dengan algoritma apa? Apakah itu cdshell? Bagaimana jika Anda tidak menjalankan shell? Apakah ini sederhana "jika ~ diikuti oleh sesuatu, berkembang secara berbeda?" atau adakah penanganan khusus lainnya untuk kondisi unik ini?
Pil Ledakan
8
Lihat manual Bash pada Tilde Expansion . (Banyak cangkang dan program lain mengikuti aturan yang serupa.)
cjm
4
@ tandu: shell tidak cd, tidak ada executable eksternal untuk melakukannya (itu tidak mungkin)
Mat
1
@tandu: jika Anda tidak menjalankan shell (misalnya mencoba menggunakan ini exec(2)), ekspansi shell tidak terjadi. Tanpa ekspansi shell, ~tidak dapat digantikan oleh apa pun - itu hanya karakter lain yang valid. Ini menggigit saya pada hari-hari awal SunOS saya karena /bin/shtidak grok ~.
Alexios
5

~ diikuti oleh nama pengguna yang diperluas ke direktori home pengguna tersebut.

Ignacio Vazquez-Abrams
sumber