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 cd
dieksekusi?) Apakah ada kasus khusus untuk ~
menambahkan slash jika semuanya dihilangkan? Artinya, ~/
dan ~
berubah ke direktori yang sama, tetapi ~a
satu direktori di atas. Hal yang sama tidak dapat dikatakan untuk direktori lain yang Anda ubah.
cd-command
home
Pil Ledakan
sumber
sumber
cd
tanpa parameter berfungsi seperticd ~
. Jika Anda mengganticd
denganecho
Anda dapat melihat apa ekspresi diperluas oleh shell.Jawaban:
~
adalah alias untuk yang$HOME
disediakan oleh sejumlah shell, tetapi$HOME
lebih universal.$HOME
sebenarnya meminta shell untuk memasukkan (mengganti) variabel lingkungan HOME di sini. Ada cukup banyak variabel lingkungan berbeda yang dapat diganti, coba jalankanenv
untuk daftar. Catatan yang~
tidak selalu dikenali saat itu tidak di awal kata. Coba dua perintah ini untuk perbandingan:Yang pertama dilewatkan ke dieksekusi ls
/~
yang kemudian mencoba untuk melihat file yang disebut~
di direktori root, yang kedua berkembang$HOME
dan menjadi//home/user
yang 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/user
sama dengan mengatakan/home/user
.~username
adalah 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$HOME
yang dijamin akan didukung oleh semua shell. Juga,cd
sebenarnya 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 terpisahecho
karena ini digunakan untuk mengubah atribut fundamental dari proses shell.echo
hanyalah shell built-in untuk alasan kinerja, tetapi di masa lalu yang baik dari UNIX, hanya tersedia karena dapat dieksekusi sendiri/bin/echo
.sumber
~foo
berarti 'direktori home dari pengguna foo'.Ini tidak dilakukan oleh kernel, itu ditafsirkan oleh shell. Setiap kali shell melihat
~foo
sebagai argumen, itu secara transparan menggantinya dengan direktori home penggunafoo
dan meneruskannya di tempatnya. Jadi, ketika Anda menjalankancd ~tandu
, shell sebenarnya berjalancd /home/tandu
.sumber
cd
shell? 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?cd
, tidak ada executable eksternal untuk melakukannya (itu tidak mungkin)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/sh
tidak grok~
.~
diikuti oleh nama pengguna yang diperluas ke direktori home pengguna tersebut.sumber