Answers:
有一个实用程序可以查找用户信息,而不管该信息是否存储在本地文件(例如/etc/passwd
LDAP或LDAP)中。叫做getent
。
为了从中获取用户信息,请运行getent passwd $USER
。您将获得如下所示的一行:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
现在,您可以简单地从其中剪切主目录,例如,使用cut,如下所示:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
变量bash
。无论如何,不是直接的。
~
确实确实可以进行Tab扩展,并且tilde-prefix的getpwnam()
另一种规范行为应替换为与使用该功能获得的登录名相关联的初始工作目录的路径名,因此查找可能非常好。我不喜欢制表符扩展,但是-我喜欢键入制表符。
您可以eval
用来获取某人的主目录。
eval echo "~$USER"
至少对于本地用户而言,这可以肯定地起作用。我不知道是否使用LDAP等远程用户eval
。
eval
需要一个。Bash ~foo
在变量扩展后不处理。
USER
。
$USER
展开来只是字母字符的单个字符串。
通常的位置是/home/$USER
,但这不必是通用的。搜索此类信息的确切位置是文件内/etc/passwd
。
该文件是世界可读的(任何人都可以读取),因此任何用户都可以访问其内容。
如果文件中存在$ USER,则最后一个条目是用户HOME目录。
这将选择条目并打印HOME目录:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
对于更复杂的(远程)系统,getent是从NSS(名称服务交换库)系统获取用户信息的常用命令。
一个命令
echo $(getent passwd $USER )| cut -d : -f 6
将提供等效信息(如果可用)。
如果用户不存在,getent
将返回错误。
这是一个小的shell函数,它不会忽略的退出代码getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
这是一个用法示例:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
如果您以root用户身份登录,或者您知道USER
的密码,或者USER
没有密码,那么以下是另一种选择:
su -c 'echo ~' ${USER}
在标准su
行为下,如果USER
未定义或为空,su
则将尝试以超级用户身份运行命令。
如果的值USER
不是有效的用户名,则会引发相应的错误:su: user <user> does not exist
。
这里已经有很多不错的答案,但这仍然可以帮助某人。