是否可以重新定义代字号(“〜”,主目录)?


13

是否可以重新定义主目录?例如/ext1/username而不是/home/username~即将扩展到另一个目录(与更改用户主文件所在的实际主目录相反)。

(此问题大部分是学术性的,因为这样做似乎是一种不好的做法。csh尽管已阅读了前10名,但我在使用问题上也别无选择。)


11
您是要更改实际主目录,还是要使Shell扩展~到实际主目录以外的其他目录?
derobert 2013年

我的意思是将~目录扩展到另一个目录(如果我不正确地理解您的替代目录,则不能更改所有用户主目录的位置)。我没有意识到这~$HOME@michas在他的回答中描述的的缩写形式。
安德鲁昌

2
并非所有用户的主目录,您只能更改一个目录,如slm在他的答案中所示。
derobert

Answers:


28

代字号~由您的shell解释。您的shell将解释~为的简写形式$HOME

尝试(echo ~; HOME=foo; echo ~)。这应该首先打印您的真实主目录,然后打印“ foo”(如您所设)$HOME

默认值$HOME来自您的系统配置。使用getent passwd列出所有已知用户和他们的主目录。根据您的系统配置,这些条目可能来自/etc/passwd或来自任何远程目录服务。

如果只想临时重新定义主目录,只需设置另一个$HOME

如果您要永久更改它,则必须更改passwd条目,例如通过手动编辑/etc/passwd


谢谢,@ michas。不敢相信我错过了那个变量。(顺便说一句,结果csh是相关变量是$home(小写),您不能setenv HOME /ext1/acheong-只能set home=/ext1/acheong,并且对我有用。)
Andrew Cheong 2013年

2
要永久更改,您还可以使用usermod -d
user606723,2013年

1
使用vipw(或操作系统提供的任何GUI)而不是/etc/passwd直接编辑。直接编辑可能会损坏文件,这可能很难恢复。
基思·汤普森

11

用于~的值由您从管理数据库(getent passwd)中获取的值确定,通常是在/etc/passwd文件中为其中定义的每个用户的主目录。

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

该文件的第六列是某人键入内容时使用的值所在的位置cd ~

nsswitch

您可以使用以下命令查看系统用于用户主目录的内容getent passwd

$ getent passwd
root:x:0:0:root:/root:/bin/bash
sam:x:500:500:Sam Mingolelli:/home/sam:/bin/bash
tracy:x:501:501::/home/tracy:/bin/bash

提供这些功能的“数据库”由您的系统解析器控制,该解析器在中定义/etc/nsswitch.conf

$ grep passwd /etc/nsswitch.conf 
#passwd:    db files nisplus nis
passwd:     files

上面的文件表示/etc/passwd,但是“数据库”可能来自LDAP,NIS或网络上的其他位置。

移动/重新定义?

创建帐户后,执行此操作有些棘手。如果要从头开始创建帐户,那么重新定义用户主目录的位置很简单。运行useradd命令时,您可以指定用于用户主目录的位置。

$ useradd -d /ext1/acheong ...

手册页摘录

-d, --home HOME_DIR
   The new user will be created using HOME_DIR as the value for the users 
   login directory. The default is to append the LOGIN name to BASE_DIR and 
   use that as the login directory name. The directory HOME_DIR does not 
   have to exist but will not be created if it is missing.

对于现有帐户?

由于通常将用户主目录的路径静态地包含在配置文件中,因此这变得更加外科手术。

$ grep home /home/sam/.*
/home/sam/.gtkrc-1.2-gnome2:include "/home/sam/.gtkrc.mine"

这些要么需要修复,要么必须提供从/home/sam到新位置的链接/ext1/sam

当没有“数据库”时移动 /etc/passwd

如果系统从LDAP,NIS等获取主目录,则需要在这些系统中执行重定位,并协调文件从/home/sam移至/ext1/sam

参考文献


当然,更改此设置将需要移动用户的文件。可能在旧地方留下了符号链接(否则很多事情都会中断...)
derobert 2013年

@derobert-是的,我做了几次,所以尽量避免像瘟疫一样。
slm

@slm-感谢您提供如此详尽的答案(以及一点点的历史)。恐怕我想做些更简单的事情-而且我不知道是否存在代表会话主目录的环境变量。不过,我相信您的回答会在将来对其他读者有所帮助。再次感谢。
安德鲁昌

1

如果原因是要在多个文件系统中分散用户,则也可以使用automounter。甚至允许您为用户提供一个不同的“基本”目录。

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.