我很好奇为什么我们不能同时使用任一用户的家庭主管
$ cd ~"$USER"
要么
$ cd ~${USER}
我很好奇为什么我们不能同时使用任一用户的家庭主管
$ cd ~"$USER"
要么
$ cd ~${USER}
Answers:
这在很大程度上取决于外壳以及在这些外壳中完成扩展的顺序。
~$user
扩展到用户的主目录,该用户的名称存储在$user
csh(该~user
功能的来源),AT&T ksh,zsh,fish中。
但是请注意以下变化:
$ u=daemon/xxx csh -c 'echo ~$u'
/usr/sbin/xxx # same in zsh/fish
$ u=daemon/xxx ksh93 -c 'echo ~$u'
~daemon/xxx
$ u=daemon/xxx csh -c 'echo ~"$u"'
Unknown user: daemon/xxx.
$ u=daemon/xxx zsh -c 'echo ~"$u"'
/usr/sbin/x # same in fish
$ u=" daemon" csh -c 'echo ~$u'
/home/stephane daemon
$ u=" daemon" zsh -c 'echo ~$u'
~ daemon # same in ksh/fish
$ u="/daemon" csh -c 'echo ~$u'
/home/stephane/daemon # same in zsh
$ u="/daemon" fish -c 'echo ~$u'
~/daemon # same in ksh
它扩展到字面上指定的用户的主目录$user
中bash
(前提是用户的存在,这是不太可能,当然)。
并且无论是在pdksh
,dash
,yash
,大概是因为他们不认为$user
是一个有效的用户名。
如果要使用在变量扩展之前发生波浪号扩展的shell之一,则查找变量用户主目录的另一种方法是getent。该工具至少在Linux,Solaris和FreeBSD上存在。我不确定它有多普遍。
$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs
与波浪号扩展一样,su - $USER -c 'echo $HOME'
如果您有权限执行此操作,则可能无法提供与打印一样的内容。
perl -le 'print((getpwnam shift)[7])' -- "$USER"
可能更便携。