Dalam bash eval tidak diperlukan hanya dengan echo ~$usernameapa-apa, tetapi dalam
shal
Ini terkadang memberikan nilai yang salah, mungkin folder rumah dari akun sebelumnya dengan nama pengguna yang sama?
Andrew
@AndrewMacFie: Apa yang Anda maksud dengan "sebelumnya"?
choroba
1
@choroba Tambah pengguna, hapus pengguna, lalu tambahkan pengguna dengan nama pengguna yang sama. Jika folder rumah pengguna berbeda untuk kedua kalinya, perintah ini memberikan folder awal yang asli dan bukan yang saat ini. Glenn jackman memberikan jawaban saat ini.
Andrew
Perhatikan juga bahwa jika Anda eval echo "~$USER"membuat asumsi yang $USERtidak mengandung karakter khusus yang dapat ditafsirkan oleh shell. Misalnya, jika USER="foo\$bar", maka ketika kita evalshell akan menggantikan $barke output Anda yang bukan yang Anda inginkan. Pada dasarnya, jika Anda mengambil rute ini, Anda perlu memastikan bahwa itu $USERadalah input yang waras. Sebagian besar waktu mungkin akan terjadi, tetapi Anda harus mengingat ini.
Zorawar
65
Ini mungkin bekerja untuk Anda:
homedir=$( getent passwd "$USER"| cut -d:-f6 )
Ini juga akan berfungsi pada pengguna yang bukan Anda. Misalnya,
Ini tidak akan berfungsi jika Anda berada di lingkungan sudo'ed dan tidak lulus flag sudo -H atau -i - $ HOME akan tetap menjadi direktori home pengguna (sudo'ing) sebelumnya.
Asfand Qazi
1
Saya tidak tahu apakah itu membantu, tetapi menempatkan tilde di luar ekspresi berfungsi pada ZSH tetapi tidak pada Bash:
Itu tidak akan berhasil; ide di sini adalah untuk melakukan ini dalam skrip shell, dan mungkin tanpa memerlukan kredensial pengguna yang bersangkutan ...
SamB
-1 untuk alasan yang sama SamB disebutkan. Saya mengedit jawaban Anda karena saya ingin Anda melihat cara menggunakan pemformatan Markdown, dan agar lebih ringkas. Anda juga melewatkan metode yang jauh lebih mudah, yaitu adil echo $HOME.
echo ~$username
apa-apa, tetapi dalameval echo "~$USER"
membuat asumsi yang$USER
tidak mengandung karakter khusus yang dapat ditafsirkan oleh shell. Misalnya, jikaUSER="foo\$bar"
, maka ketika kitaeval
shell akan menggantikan$bar
ke output Anda yang bukan yang Anda inginkan. Pada dasarnya, jika Anda mengambil rute ini, Anda perlu memastikan bahwa itu$USER
adalah input yang waras. Sebagian besar waktu mungkin akan terjadi, tetapi Anda harus mengingat ini.Ini mungkin bekerja untuk Anda:
Ini juga akan berfungsi pada pengguna yang bukan Anda. Misalnya,
sumber
getenv
daripada mengasumsikan lokasipasswd
bahkan selangkah lebih maju daripada mengasumsikan lokasi rumah adalah/home/
Tampaknya Anda adalah pengguna itu - mengapa tidak
?
sumber
Saya tidak tahu apakah itu membantu, tetapi menempatkan tilde di luar ekspresi berfungsi pada ZSH tetapi tidak pada Bash:
sumber
Setelah Anda masuk, jalankan
cd
untuk pergi ke direktori home Anda, kemudian jalankanpwd
untuk mencetak direktori yang berfungsi.sumber
echo $HOME
.