Saya ingin tahu mengapa kita tidak bisa beralih ke direktur rumah pengguna juga
$ cd ~"$USER"
atau
$ cd ~${USER}
shell
command-line
Neo_Returns
sumber
sumber
Jawaban:
Itu sangat tergantung pada shell dan urutan ekspansi dilakukan pada shell tersebut.
~$user
memperluas ke direktori home dari pengguna yang namanya disimpan di$user
csh (dari mana~user
fitur itu berasal), AT&T ksh, zsh, fish.Namun perhatikan variasi ini:
Itu diperluas ke direktori home dari pengguna yang bernama secara harfiah
$user
dibash
(asalkan pengguna itu ada, yang tentu saja sangat tidak mungkin).Dan dalam tidak
pdksh
,dash
,yash
, mungkin karena mereka tidak menganggap$user
menjadi nama pengguna yang valid.sumber
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$USER
tidak diperluas pada titik itu dan karena itu tidak mungkin sesuai dengan nama pengguna yang valid, tilde dibiarkan tidak diperluas.$USER
cenderung menjadi nama pengguna dari pengguna saat ini, jadi ekspresi Anda mungkin bisa diganti dengan adil~
.sumber
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
bash
dengan sedikit perubahan pada perintah Anda. Cukup awali perintah denganeval
.akan berubah ke direktori home pengguna yang diberikan oleh nama pengguna dalam variabel
USER
, asalkan$USER
tidak mengandung karakter khusus untuk shell (jika ada kemungkinan jauh, Anda tidak boleh meneruskannya sebagai argumeneval
karena itu akan berbahaya ) atau/
karakter dan ada entri untuk pengguna itu di basis data pengguna sistem.sumber
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.
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.sumber
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 :-)
sumber