光盘~是可能的,但为什么我们不能 cd ~"$USER" 或 cd ~${USER}

光盘~是可能的,但为什么我们不能 cd ~"$USER" 或 cd ~${USER}

我很好奇为什么我们不能切换到用户的主目录

$ cd ~"$USER"

或者

$ cd ~${USER}

答案1

这在很大程度上取决于 shell 以及在这些 shell 中完成扩展的顺序。

~$user扩展到名称存储在$usercsh(该~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(假设该用户存在,当然这不太可能)。

pdkshdash、中的任何一个都不是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并不像她/他想象的那样了解可以做什么:-)

相关内容