Saya ingin tahu mengapa kita tidak bisa beralih ke direktur rumah pengguna juga
$ cd ~"$USER"
atau
$ cd ~${USER}
Saya ingin tahu mengapa kita tidak bisa beralih ke direktur rumah pengguna juga
$ cd ~"$USER"
atau
$ cd ~${USER}
Jawaban:
Itu sangat tergantung pada shell dan urutan ekspansi dilakukan pada shell tersebut.
~$usermemperluas ke direktori home dari pengguna yang namanya disimpan di $usercsh (dari mana ~userfitur itu berasal), AT&T ksh, zsh, fish.
Namun perhatikan variasi ini:
$ u=daemon/xxx csh -c 'echo ~$u'
/usr/sbin/xxx # same in zsh/fish
$ u=daemon/xxx ksh93 -c 'echo ~$u'
~daemon/xxx
$ u=daemon/xxx csh -c 'echo ~"$u"'
Unknown user: daemon/xxx.
$ u=daemon/xxx zsh -c 'echo ~"$u"'
/usr/sbin/x # same in fish
$ u=" daemon" csh -c 'echo ~$u'
/home/stephane daemon
$ u=" daemon" zsh -c 'echo ~$u'
~ daemon # same in ksh/fish
$ u="/daemon" csh -c 'echo ~$u'
/home/stephane/daemon # same in zsh
$ u="/daemon" fish -c 'echo ~$u'
~/daemon # same in ksh
Itu diperluas ke direktori home dari pengguna yang bernama secara harfiah $userdi bash(asalkan pengguna itu ada, yang tentu saja sangat tidak mungkin).
Dan dalam tidak pdksh, dash, yash, mungkin karena mereka tidak menganggap $usermenjadi nama pengguna yang valid.
Ekspansi Tilde adalah langkah terpisah dalam pemrosesan baris perintah. Itu terjadi sesaat sebelum ekspansi variabel.
Jika tilde diikuti oleh sesuatu selain dari slash, itu akan diperluas ke direktori home pengguna yang namanya mengikuti tilde, seperti pada, misalnya ~otheruser,. Karena $USERtidak diperluas pada titik itu dan karena itu tidak mungkin sesuai dengan nama pengguna yang valid, tilde dibiarkan tidak diperluas.
$USERcenderung menjadi nama pengguna dari pengguna saat ini, jadi ekspresi Anda mungkin bisa diganti dengan adil ~.
Seperti jawaban lain telah menunjukkan perilaku tergantung pada urutan yang dilakukan shell ~dan $ekspansi dan apakah itu akan melakukan keduanya untuk kata yang sama.
Perilaku yang Anda cari dimungkinkan untuk dicapai bashdengan sedikit perubahan pada perintah Anda. Cukup awali perintah dengan eval.
eval "cd ~$USER"
akan berubah ke direktori home pengguna yang diberikan oleh nama pengguna dalam variabel USER, asalkan $USERtidak mengandung karakter khusus untuk shell (jika ada kemungkinan jauh, Anda tidak boleh meneruskannya sebagai argumen evalkarena itu akan berbahaya ) atau /karakter dan ada entri untuk pengguna itu di basis data pengguna sistem.
Cara alternatif untuk mencari direktori home pengguna variabel, jika Anda menggunakan salah satu shell di mana ekspansi tilde terjadi sebelum ekspansi variabel, adalah dengan getent . Alat ini setidaknya ada di Linux, Solaris, dan FreeBSD; Saya tidak yakin seberapa universal itu.
$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs
Seperti halnya ekspansi tilde, ini mungkin tidak memberi Anda hal yang sama yang su - $USER -c 'echo $HOME'akan dicetak jika Anda memiliki hak istimewa untuk melakukan itu.
perl -le 'print((getpwnam shift)[7])' -- "$USER"berpotensi sedikit lebih portabel.
Karena OP bersikeras pada jawaban, ini dia.
Perilaku perintah-perintah itu (dan banyak hal lainnya) tergantung pada shell tertentu yang kebetulan Anda gunakan. Kecuali Anda menentukan shell tertentu yang Anda gunakan, mungkin tidak mungkin memberikan jawaban yang sederhana.
Sebagai soal fakta, jika Anda menggunakan tcsh, seperti yang saya lakukan, kedua ekspresi dalam pertanyaan OP (seperti yang tertulis saat saya menulis ini - saya tidak bertanggung jawab atas pengeditan masa depan!) Berfungsi dengan baik. Saya tidak tahu apa yang akan dilakukan kerang lain, karena saya tidak menggunakannya. Jadi mungkin OP tidak tahu banyak tentang apa yang bisa dilakukan seperti yang dia pikirkan :-)