Bạn không bao giờ nên phân tích /etc/passwdtrực tiếp. Bạn có thể đang ở trên một hệ thống có người dùng từ xa, trong trường hợp đó họ sẽ không tham gia /etc/passwd. Các /etc/passwdtập tin có thể là một nơi khác. Vân vân.
Nếu bạn cần truy cập trực tiếp vào cơ sở dữ liệu người dùng, hãy sử dụng getent.
$ getent passwd phemmer
phemmer:*:1000:4:phemmer:/home/phemmer:/bin/zsh
$ getent passwd phemmer | awk -F: '{ print $6 }'
/home/phemmer
Tuy nhiên, cũng có một cách khác không liên quan đến phân tích cú pháp:
$ user=phemmer
$ eval echo "~$user"
/home/phemmer
Các ~nhà điều hành trong lớp vỏ mở rộng vào thư mục chính của người dùng chỉ định. Tuy nhiên, chúng ta phải sử dụng evalvì việc mở rộng biến $userxảy ra sau khi mở rộng ~. Vì vậy, bằng cách sử dụng evaldấu ngoặc kép và đôi, bạn thực sự mở rộng $usertrước, sau đó gọi eval echo "~phemmer".
Một khi bạn có thư mục nhà, đơn giản là giải /.sshquyết đến cùng.
$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh