假设某个用户有一个主目录/ home / someuser
NAME = SomeUser是否
在bash中 - 我用什么表达式组合使用tilde(〜)和$ NAME来返回用户主目录?
HOMEDIRECTORY=~someuser
echo $HOMEDIRECTORY
/home/someuser
NAME=someuser
echo ~$NAME
~someuser
有什么建议吗?
答案 0 :(得分:16)
更安全:
eval HOMEDIRECTORY="$(printf "~%q" "$NAME")"
此处%q
选项printf
引用并转义危险字符。
如果$NAME
是乔,你会得到类似/home/joe
的内容。对于root,您可能会获得/root
。对于“abc; rm something”你会得到“〜abc; rm something”而不是删除某些内容。
答案 1 :(得分:6)
如果您有权访问getent
:
getent passwd "$NAME" | cut -d: -f 6
答案 2 :(得分:1)
Tilde(〜)它与$ HOME相同,所以并非所有用户都将以root用户身份归属于同一目录。
但是如果你坚持使用代字号,那就行了:
echo ~/../$NAME
见:
$ pwd
/home/oreyes
$ export NAME=john
$ export DIRECTORYNAME=~/../$NAME
$ cd $DIRECTORYNAME
$ pwd
/home/john
答案 3 :(得分:1)
bash和csh之间的有趣区别,其中〜$ VARNAME实际上是你所期望的!
这很难看,但它似乎在bash中起作用:
homedir=`eval "echo ~$USERNAME"`
现在$ homedir保存与$ USERNAME相关联的主目录。
答案 4 :(得分:1)
最佳方法
必填:没有 ( n.b。,这与 getent 的技术相同,不需要 getent )
home() { # returns empty string on invalid user
grep "^$1:" /etc/passwd | cut -d ':' -f 6
}
# grep "^$user:" /etc/passwd | cut -d ':' -f 6
/var/lib/memcached
ROOT LINUX的NICE方法
必需:Linux, root (或 sudo )
home() { # returns errorlevel 1 on invalid user
su "$1" -s '/bin/sh' -c 'echo $HOME'
}
# su memcached -s '/bin/sh' -c 'echo $HOME'
/var/lib/memcached
完全扩展的解决方案
magic() { # returns unexpanded tilde express on invalid user
local _safe_path; printf -v _safe_path "%q" "$1"
eval "ln -sf $_safe_path /tmp/realpath.$$"
readlink /tmp/realpath.$$
rm -f /tmp/realpath.$$
}
使用示例:
$ magic ~nobody/would/look/here
/var/empty/would/look/here
$ magic ~invalid/this/will/not/expand
~invalid/this/will/not/expand
治疗CSH的方法
这是一个BASH脚本,只需调用 csh 。
必填: csh
home() { # return errorlevel 1 on invalid user
export user=$1; csh -c "echo ~$user"
}
$ export user=root; csh -c "echo ~$user"
/var/root
$ export user=nodfsv; csh -c "echo ~$user"
Unknown user: nodfsv.
解决方法
必填:手指(已弃用)
home() {
finger -m "$1" |
grep "^Directory:" |
sed -e 's/^Directory: //' -e 's/ .*//'
}
# finger -m "haldaemon" |
> grep "^Directory:" |
> sed -e 's/^Directory: //' -e 's/ .*//'
/home/haldaemon
您可以将 grep 操作合并到 sed 中,但由于此方法很糟糕,我不会打扰。
答案 5 :(得分:0)
一种替代方式
awk -F":" '{print "user: "$1", Home directory is: "$6}' /etc/passwd