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 cd
tidak diberikan argumen apa pun, itu akan menggunakan nilai $HOME
jika 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 $HOME
jika variabel disetel; hasilnya tidak ditentukan sebaliknya. -tilde expansion
Jadi jika $HOME
diatur, maka ketiga perintah itu setara. (Garis miring ekstra setelah nama direktori tidak ada artinya.)
Namun, jika $HOME
ini tidak diatur, maka hasil dari kedua ~
-expansion dan cd
yang tidak ditentukan :
Dalam bash , AT&T ksh , dan Heirloom sh , plain cd
akan gagal dengan "no home direktori".
Di csh , zsh , dash , dan mksh MirBSD , plain cd
tidak akan melakukan apa-apa.
Di tcsh , plain cd
akan 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 $HOME
disetel - mungkin mendahului konvensi.
Dari ini, hanya csh dan zsh menempel pada definisi POSIX untuk memperluas ~
nilai $HOME
bahkan jika itu kosong.
( Kerang ikan selalu ditetapkan $HOME
dari 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.