Perbedaan antara perintah direktori hampir sama

2

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?

Caday Belmark
sumber

Jawaban:

9

POSIX mendefinisikan bahwa ...

  1. ... 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

  2. ... 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.)

grawity
sumber
1
Apakah Anda hafal ini atau Anda benar-benar berusaha lebih keras?
slhck
3
Saya sudah menginstal kerang, jadi ...
grawity
Komentar Anda tentang AT&T yang diperluas ke nama pengguna mengingatkan saya pada trik rapi di bash, dash, dan mungkin yang lain: cd ~<username>akan membawa Anda ke <username>rumah.
GnP
0

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 ; }
  1. akan membawa Anda ke /, sementara 2. dan 3. akan membawa Anda pulang.
choroba
sumber
2
Karena aku ingin pulang ke rumah :(
Belmark Caday