cd ~ <user> dimungkinkan tetapi mengapa kita tidak dapat cd ~ “$ USER” atau cd ~ $ {USER}

8

Saya ingin tahu mengapa kita tidak bisa beralih ke direktur rumah pengguna juga

$ cd ~"$USER"

atau

$ cd ~${USER}
Neo_Returns
sumber
4
Karena jauh lebih sederhana hanya dengan mengetik "cd"?
jamesqf
7
@ jamesqf, kita semua tahu apa yang bisa dilakukan .. pertanyaannya di sini adalah tentang apa yang tidak bisa dilakukan dan mengapa?
Neo_Returns

Jawaban:

20

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.

Stéphane Chazelas
sumber
Bisakah Anda menyarankan saya di mana saya dapat mempelajari lebih lanjut tentang ekspansi dalam berbagai shell
Neo_Returns
6
@Neo_Returns, manualnya masing-masing, dan ketika itu tidak didokumentasikan dengan jelas, dengan coba-coba dan kode sumber untuk mereka yang tersedia ...
Stéphane Chazelas
10

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

Kusalananda
sumber
6

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.

kasperd
sumber
3

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.

zwol
sumber
1
Lihat juga perl -le 'print((getpwnam shift)[7])' -- "$USER"berpotensi sedikit lebih portabel.
Stéphane Chazelas
-2

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 :-)

jamesqf
sumber