我很好奇为什么我们不能切换到用户的主目录
$ cd ~"$USER"
或者
$ cd ~${USER}
答案1
这在很大程度上取决于 shell 以及在这些 shell 中完成扩展的顺序。
~$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
是有效的用户名。
答案2
波形符扩展是命令行处理中的一个单独步骤。它发生只是前变量扩展。
如果波浪号后面跟着斜杠以外的其他内容,它将扩展到名称在波浪号后面的用户的主目录,例如,~otheruser
。由于$USER
此时未展开,并且它不太可能对应于有效的用户名,因此代字号不会展开。
$USER
可能是当前用户的用户名,因此您的表达式可能会被替换为~
.
答案3
正如其他答案所指出的那样,该行为取决于 shell 执行的顺序~
和$
扩展以及它是否会对同一个单词执行这两种操作。
您所寻找的行为可以bash
通过对您的命令进行很小的更改来实现。只需在命令前面加上eval
.
eval "cd ~$USER"
将更改为变量中用户名给出的用户的主目录USER
,前提是$USER
不包含 shell 特殊的字符(如果有可能,则不应将其作为参数传递,eval
因为这会很危险) 或/
字符,并且系统的用户数据库中有该用户的条目。
答案4
由于OP坚持要求答案,所以就在这里。
这些命令(以及许多其他内容)的行为取决于您碰巧使用的特定 shell。除非您指定使用哪个特定 shell,否则可能无法给出简单的答案。
事实上,如果你像我一样使用 tcsh,OP 问题中的两个表达式(正如我写这篇文章时所写的那样 - 我对未来的编辑不承担任何责任!) 工作得很好。我不知道其他 shell 会做什么,因为我不使用它们。所以也许OP并不像她/他想象的那样了解可以做什么:-)