可以使用cd〜<user>,但是为什么不能使用cd〜“ $ USER”或cd〜$ {USER}


8

我很好奇为什么我们不能同时使用任一用户的家庭主管

$ cd ~"$USER"

要么

$ cd ~${USER}

4
因为只是键入“ cd”要简单得多?
jamesqf

7
@jamesqf,我们都知道可以做..这里的问题是关于什么不能做以及为什么?
Neo_Returns

Answers:


20

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

~$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

它扩展到字面上指定的用户的主目录$userbash(前提是用户的存在,这是不太可能,当然)。

并且无论是在pdkshdashyash,大概是因为他们不认为$user是一个有效的用户名。


您能否建议我,在哪里可以了解有关各种shell扩展的更多信息。
Neo_Returns

6
@Neo_Returns,它们各自的手册,和当那是没有明确记载下来,试验和错误,并为那些源代码在何处使用...
斯特凡Chazelas

10

波浪号扩展是命令行处理中的一个单独步骤。它发生变量扩展之前

如果在波浪号后面加上斜杠以外的其他字符,它将扩展到名称后面跟随波浪号的用户的主目录,例如~otheruser。由于此时$USER尚未扩展,而且由于它不太可能与有效的用户名相对应,因此代字号保持未扩展状态。

$USER可能是当前用户的用户名,因此您的表达式可能被just代替~


6

正如其他答案所指出的那样,行为取决于外壳程序执行~$扩展的顺序,以及它是否会对同一单词同时执行两个操作。

bash只需对命令进行很小的更改就可以实现您正在寻找的行为。只需在命令前加上eval

eval "cd ~$USER"

将更改为变量中用户名给定的用户的主目录USER,前提$USER是其中不包含shell专用的字符(如果极有可能这样做,则不应将其作为参数传递给eval,这很危险)或/字符,并且在系统的用户数据库中有该用户的条目。


3

如果要使用在变量扩展之前发生波浪号扩展的shell之一,则查找变量用户主目录的另一种方法是getent。该工具至少在Linux,Solaris和FreeBSD上存在。我不确定它有多普遍。

$ USER=bloggs
$ getent passwd "$USER" | cut -d: -f6
/home/b/bloggs

与波浪号扩展一样,su - $USER -c 'echo $HOME'如果您有权限执行此操作,则可能无法提供与打印一样的内容。


1
另请参见perl -le 'print((getpwnam shift)[7])' -- "$USER"可能更便携。
斯特凡Chazelas

-2

由于OP坚持要回答,所以就在这里。

这些命令(以及许多其他事情)的行为取决于您恰巧正在使用的特定外壳。除非您指定使用哪个特定的Shell,否则可能无法给出简单的答案。

实际上,如果您像我一样使用tcsh,那么OP问题中的两个表达式(正如我写这篇文章时所写的那样-我对以后的编辑不承担任何责任!)工作得很好。我不知道其他外壳会做什么,因为我不使用它们。因此,也许OP并不如他/她所想的那样了解太多:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.