5

Assume someuser has a home directory /home/someuser

NAME=someuser

In bash - what expression to I use combining tilde (~) and $NAME to return the users home directory?

HOMEDIRECTORY=~someuser
echo $HOMEDIRECTORY
/home/someuser
NAME=someuser
echo ~$NAME
~someuser

any suggestions?

4

6 回答 6

16

更安全

eval HOMEDIRECTORY="$(printf "~%q" "$NAME")"

这里%q可以选择printf引用和转义危险字符。

如果$NAME是 joe,你会得到类似/home/joe. 对于 root,您可能会得到/root. 对于 "abc;rm something" 你会得到 "~abc;rm something" 而不是删除一些东西。

于 2010-01-15T06:23:15.567 回答
6

如果您有权访问getent

getent passwd "$NAME" | cut -d: -f 6
于 2010-01-15T04:33:56.550 回答
1

波浪号 ( ~ ) 它与 $HOME 相同,因此并非所有用户都以 root 身份进入同一目录。

但是,如果您坚持使用波浪号,请执行以下操作:

echo ~/../$NAME

看:

$ pwd
/home/oreyes
$ export NAME=john 
$ export DIRECTORYNAME=~/../$NAME
$ cd $DIRECTORYNAME
$ pwd
/home/john
于 2010-01-15T04:29:38.680 回答
1

bash 和 csh 之间有趣的区别,其中 ~$VARNAME 实际上做了你所期望的!

这很难看,但它似乎在 bash 中工作:

homedir=`eval "echo ~$USERNAME"`

现在 $homedir 保存与 $USERNAME 关联的主目录。

于 2010-01-15T04:30:11.490 回答
1

最佳方法

必需:没有(注意,这与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 的好方法

必需: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中,但由于这种方法很糟糕,我不会打扰。

于 2015-05-22T15:15:57.433 回答
0

one alternative way

awk -F":" '{print "user: "$1", Home directory is: "$6}' /etc/passwd
于 2010-01-15T04:16:44.493 回答