Apakah ada perbedaan antara perintah direktori ini (hampir sama)?
1. cd
2. cd ~
3. cd ~/
Saya mencobanya di shell saya, dan mereka semua mengarah ke direktori home. Apakah ada kemungkinan skenario di mana mereka berbeda?
Apakah ada perbedaan antara perintah direktori ini (hampir sama)?
1. cd
2. cd ~
3. cd ~/
Saya mencobanya di shell saya, dan mereka semua mengarah ke direktori home. Apakah ada kemungkinan skenario di mana mereka berbeda?
Jawaban:
POSIX mendefinisikan bahwa ...
... jika cdtidak diberikan argumen apa pun, itu akan menggunakan nilai $HOMEjika variabel diatur, dan tidak melakukan apa pun sebaliknya (meskipun juga dikatakan bahwa hasilnya tidak ditentukan). -cd
... jika argumen adalah ~atau dimulai dengan ~/, tilde akan diperluas ke nilai $HOMEjika variabel disetel; hasilnya tidak ditentukan sebaliknya. -tilde expansion
Jadi jika $HOMEdiatur, maka ketiga perintah itu setara. (Garis miring ekstra setelah nama direktori tidak ada artinya.)
Namun, jika $HOMEini tidak diatur, maka hasil dari kedua ~-expansion dan cdyang tidak ditentukan :
Dalam bash , AT&T ksh , dan Heirloom sh , plain cdakan gagal dengan "no home direktori".
Di csh , zsh , dash , dan mksh MirBSD , plain cdtidak akan melakukan apa-apa.
Di tcsh , plain cdakan mencari direktori home menggunakan getpwuid().
Adapun ~ekspansi ...
bash dan tcsh akan diperluas ~ke direktori home dari getpwnam().
AT&T ksh akan diperluas ~ke nama pengguna Anda (?!).
Di csh dan zsh , ~akan diperluas ke string kosong. ( cd ~Karena itu tidak akan melakukan apa pun, seperti biasa cd, dalam cangkang itu.)
Di dash dan mksh MirBSD , ~akan tetap literal ~. (Menggunakan cd ~akan mencoba mengubah ke direktori bernama tersebut.)
Heirloom sh tidak pernah mengembang ~bahkan jika $HOMEdisetel - mungkin mendahului konvensi.
Dari ini, hanya csh dan zsh menempel pada definisi POSIX untuk memperluas ~nilai $HOMEbahkan jika itu kosong.
( Kerang ikan selalu ditetapkan $HOMEdari getpwnam()saat startup jika variabel kosong, dan menolak untuk mengubahnya setelah itu.)
cd ~<username>akan membawa Anda ke <username>rumah.
Yah, saya bisa membayangkan skenario di mana 1 berbeda dengan 2 dan 3. Cobalah mendefinisikan fungsi berikut di bash:
cd () { if (($#)) ; then builtin cd "$1" ; else cd / ; fi ; }
/, sementara 2. dan 3. akan membawa Anda pulang.