设置用户的起始目录时,需要为用户的登录 shell 提供用户初始化文件。用户初始化文件是一个 shell 脚本,用来在用户登录系统之后为其设置工作环境。使用用户初始化文件基本上可以执行 shell 脚本所能完成的全部任务。但是,用户初始化文件的主要任务是定义用户工作环境的特征,如用户的搜索路径、环境变量和窗口环境。每个登录 shell 都有各自的初始化文件,下表列出了这些文件。
表 4–15 Bourne Shell、C Shell 和 Korn Shell 的用户初始化文件
Shell |
用户初始化文件 |
目的 |
---|---|---|
Bourne |
$HOME/.profile |
在用户登录时定义用户的环境 |
$HOME/.cshrc |
为所有的 C shell 定义用户环境,在登录 shell 之后调用 |
|
|
在用户登录时定义用户的环境
|
|
在用户登录时定义用户的环境 |
||
|
$HOME/$ENV |
在用户登录文件时定义用户的环境,由 Korn shell 的 ENV 环境变量指定 |
表 4–16 缺省的用户初始化文件
Shell |
缺省文件 |
---|---|
| |
您可以使用这些文件作为起点,之后修改这些文件,以创建可为所有用户提供通用工作环境的标准文件集。也可以修改这些文件,以便为不同类型的用户提供工作环境。尽管不能使用“用户工具”创建自定义的用户初始化文件,但是可以使用那些位于指定“框架”目录中的用户初始化文件填充用户的起始目录。这可以通过以下方法来完成此任务:使用“用户模板”工具创建用户模板,然后指定要从中复制用户初始化文件的框架目录。
有关如何为不同类型的用户创建用户初始化文件集的逐步说明,请参见如何自定义用户初始化文件。
在使用用户工具创建新用户帐户并选择“创建起始目录”选项时,将创建下列文件,具体情况取决于选定的登录 shell。
表 4–17 在添加用户时使用用户工具创建的文件
Shell |
所创建的文件 |
---|---|
C |
/etc/skel/local.cshrc 和 /etc/skel/local.login 文件将被复制到用户的起始目录中,并分别被重命名为 .cshrc 和 .login。 |
Bourne 和 Korn |
/etc/skel/local.profile 文件将被复制到用户的起始目录中,并被重命名为 .profile |
要自定义 Bash Shell,请将信息添加到位于起始目录的 .bashrc 文件中。安装 Oracle Solaris 时创建的初始用户具有一个 .bashrc 文件,可设置 PATH、MANPATH 和命令提示符。有关更多信息,请参见 bash (1) 手册页。
用户初始化文件可以由管理员和用户进行自定义。此重要任务可以通过位于集中位置且分布在全局的名为站点初始化文件的用户初始化文件来完成。使用站点初始化文件,可以不断向用户的工作环境中引入新功能,同时允许用户自定义用户初始化文件。
如果您在用户初始化文件中引用站点初始化文件,那么,当用户登录系统时或者当用户启动新 shell 时,对于站点初始化文件进行的所有更新都将自动反映出来。站点初始化文件旨在将系统范围的更改分发到您在添加用户时未参与的用户工作环境中。
可以按照自定义用户初始化文件的方式自定义站点初始化文件。站点初始化文件通常驻留在一台或一组服务器上,并作为第一条语句出现在用户初始化文件中。而且,每个站点初始化文件都必须与引用它的用户初始化文件属于相同类型的 shell 脚本。
要在 C-shell 用户初始化文件中引用站点初始化文件,请在用户初始化文件的起始位置插入类似以下内容的一行:
source /net/machine-name/export/site-files/site-init-file |
要在 Bourne-shell 或 Korn-shell 用户初始化文件中引用站点初始化文件,请在用户初始化文件的起始位置插入类似以下内容的一行:
. /net/machine-name/export/site-files/site-init-file |
请勿在用户初始化文件中添加对本地系统的具体引用。无论用户登录哪个系统,用户初始化文件中的指令均应为有效指令。
例如:
为了使用户的起始目录可在网络上的任何位置使用,请始终用变量 $HOME 引用起始目录。例如,使用 $HOME/bin,而不使用 /export/home/username/bin。当用户登录另一个系统时,$HOME 变量将会运行,从而自动挂载起始目录。
要访问本地磁盘上的文件,请使用全局路径名,如 /net/system-name/directory-name。由 /net/system-name 引用的任何目录都可以在用户所登录的系统上自动挂载(假设该系统运行的是 AutoFS)。
下表列出了每个 shell 提供的基本 shell 功能,这有助于确定在为每个 shell 创建用户初始化文件时可以执行的操作和不能执行的操作。
表 4–18 Bourne Shell、C Shell 和 Korn Shell 的基本功能
功能 |
Bourne |
C |
Korn |
---|---|---|---|
是否可以称作 UNIX 中的标准 shell |
适用 |
不适用 |
不适用 |
是否与 Bourne shell 的语法兼容 |
- |
不适用 |
适用 |
是否提供作业控制 |
适用 |
适用 |
适用 |
是否提供历史记录列表 |
不适用 |
适用 |
适用 |
是否提供命令行编辑 |
不适用 |
适用 |
适用 |
是否提供别名 |
不适用 |
适用 |
适用 |
是否提供登录目录的单字符缩写 |
不适用 |
适用 |
适用 |
是否防止覆写 (noclobber) |
不适用 |
适用 |
适用 |
是否设置为忽略 Ctrl-D (ignoreeof) |
不适用 |
适用 |
适用 |
是否提供增强的 cd 命令 |
不适用 |
适用 |
适用 |
是否将初始化文件与 .profile 与分开 |
不适用 |
适用 |
适用 |
是否提供退出文件 |
不适用 |
适用 |
shell 可维护包含一组变量的环境,这些变量由 login 程序、系统初始化文件和用户初始化文件定义。另外,某些变量是在缺省情况下定义的。
Shell 可以有两种类型的变量:
环境变量-导出到由 shell 产生的所有进程的变量。可以使用 env 命令查看这些变量的设置。环境变量的子集(如 PATH)影响 shell 本身的行为。
Shell(局部)变量-仅影响当前 shell 的变量。在 C shell 中,一组 shell(局部)变量与相应的一组环境变量具有特殊关系。这些 shell 变量包括 user、term、home 和 path。相应环境变量的值最初用来设置 shell 变量。
在 C shell 中,使用小写名称和 set 命令来设置 shell 变量。使用大写名称和 setenv 命令来设置环境变量。如果设置 shell 变量,shell 会设置相应的环境变量。同样,如果设置环境变量,相应的 shell 变量也会更新。例如,如果使用一个新路径更新 path shell 变量,shell 也会用这个新路径更新 PATH 环境变量。
在 Bourne shellKorn shell 中,可以使用等于某个值的大写变量名称来设置 shell 变量和环境变量。同时也可使用 export 命令为后续要执行的任何命令激活这些变量。
对于所有的 shell,通常按变量的大写名称引用 shell 变量和环境变量。
在用户初始化文件中,可以通过更改预定义变量的值或指定其他变量来自定义用户的 shell 环境。下表显示如何在用户初始化文件中设置环境变量。
表 4–19 在用户初始化文件中设置环境变量
Shell 类型 |
添加到用户初始化文件中的行 |
---|---|
setenv MAIL /var/mail/ripley |
|
Bourne shell 或 Korn shell |
VARIABLE=value; export VARIABLE 示例: MAIL=/var/mail/ripley;export MAIL |
下表介绍了可能需要在用户初始化文件中自定义的环境变量和 shell 变量。有关不同 shell 所使用的变量的更多信息,请参见 sh(1)、ksh(1) 或 csh(1) 手册页。
表 4–20 Shell 变量和环境变量的说明
变量 |
说明 |
---|---|
设置由 cd 命令使用的变量。如果将 cd 命令的目标目录指定为相对路径名,cd 命令将首先在当前目录 (.) 中查找目标目录。如果没有找到目标目录,将继续搜索列在 CDPATH 变量中的路径名,直到找到目标目录并完成目录切换。如果没有找到目标目录,则当前的工作目录保持不变。例如,CDPATH 变量设置为 /home/jean,/home/jean 下面有两个目录:bin 和 rje。如果当前的目录是 /home/jean/bin 目录,那么,当您键入 cd rje 时,即使您未指定全路径名,目录也将切换到 /home/jean/rje。 |
|
为 C shell 设置历史记录。 |
|
设置用户起始目录的路径。 |
|
设置语言环境 (locale)。 |
|
定义当前登录用户的名称。登录程序会将 LOGNAME 的缺省值自动设置为在 passwd 文件中指定的用户名。您不应当重置此变量,而只应当引用此变量。 |
|
设置用户的缺省打印机。 |
|
设置用户邮箱的路径。 |
|
设置可用手册页的分层结构。 |
|
按顺序指定多个目录,当用户键入命令时,shell 将在这些目录搜索要运行的程序。如果该目录不在搜索路径中,用户必须键入命令的完整路径名。 在登录过程中,系统会自动定义缺省的 PATH,并将其设置为在 .profile(Bourne 或 Korn shell)或 .cshrc (C shell) 中指定的路径。 搜索路径的顺序至关重要。如果不同位置中存在相同的命令,将使用首先找到的具有该名称的命令。例如,假设在 Bourne shell 和 Korn shell 语法中将 PATH 定义为 PATH=/bin:/usr/bin:/usr/sbin:$HOME/bin,/usr/bin 和 /home/jean/bin 中均有名为 sample 的文件。如果用户键入 sample 命令而未指定其全路径名,则将使用在 /usr/bin 中找到的版本。 |
|
为 C shell 定义 shell 提示符。 |
|
为 Bourne shell 或 Korn shell 定义 shell 提示符。 |
|
设置由 make、vi 和其他工具使用的缺省 shell。 |
|
指定存储备用 terminfo 数据库的目录。可使用 /etc/profile 或 /etc/.login 文件中的 TERMINFO 变量。有关更多信息,请参见 terminfo(4) 手册页。 如果设置了 TERMINFO 环境变量,系统将首先检查由用户定义的 TERMINFO 路径。如果系统在用户定义的 TERMINFO 目录中找不到终端的定义,它将在缺省目录 (/usr/share/lib/terminfo) 中搜索终端的定义。如果系统在这两个位置均未找到终端的定义,则将终端标识为“哑终端”。 |
|
定义终端。此变量应当在 /etc/profile 或 /etc/.login 文件中重置。当用户调用编辑器时,系统将查找在该环境变量中定义的同名文件。系统将搜索 TERMINFO 所引用的目录以确定终端的特征。 |
|
设置时区。例如,时区可用于在 ls -l 命令中显示日期。如果没有在用户的环境中设置 TZ,将使用系统设置。否则,将使用格林威治标准时间。 |
当用户使用全路径执行命令时,shell 将使用该路径来查找此命令。但是,当用户仅指定命令名称时,shell 将按 PATH 变量指定的顺序在目录中搜索该命令。如果在一个目录中找到了该命令,shell 将执行该命令。
缺省路径由系统设置。但是,多数用户会通过修改该路径来添加其他命令目录。与设置环境和访问命令或工具的正确版本有关的许多用户问题都是路径定义错误引起的。
下面是设置有效 PATH 变量的一些准则:
如果无需考虑安全问题,请首先将当前的工作目录 (.) 放置在该路径中。但是,在路径中包括当前的工作目录会引起您可能希望避免的安全风险,对于超级用户尤其如此。
搜索路径应尽可能短。Shell 会在该路径中搜索每个目录。如果未找到命令,搜索长目录会降低系统性能。
搜索路径的读取顺序是从左到右,因此,您应当将常用命令的目录放在路径的开头。
确保目录在路径中不重复。
尽可能避免搜索大型目录。将大型目录放在路径的末尾处。
将本地目录放在 NFS 挂载目录之前,以便减少在 NFS 服务器不响应时“挂起”的几率。此策略还会减少不必要的网络通信流量。
此示例说明如何设置用户的缺省路径。
以下示例说明如何设置用户的缺省路径,以包括起始目录和其他 NFS 挂载目录。首先在该路径中指定当前的工作目录。在 C shell 用户初始化文件中,可以添加如下内容:
set path=(. /usr/bin $HOME/bin /net/glrr/files1/bin) |
在 Bourne shell 或 Korn shell 用户初始化文件中,可以添加如下内容:
PATH=.:/usr/bin:/$HOME/bin:/net/glrr/files1/bin export PATH |
LANG 和 LC 环境变量可以为 shell 指定特定于语言环境的转换和约定。这些转换和约定包括时区、整理顺序、日期格式、时间格式、货币格式和数字格式。另外,还可以使用用户初始化文件中的 stty 命令来指示终端会话是否支持多字节字符。
LANG 变量为给定的语言环境设置所有可能的转换和约定。可以通过以下 LC 变量来分别设置本地化的多个方面: LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_NUMERIC、LC_MONETARY 和 LC_TIME。
下表描述了 LANG 和 LC 环境变量的某些值。
表 4–21 LANG 和 LC 变量的值
值 |
语言环境 |
---|---|
de_DE.ISO8859-1 |
德语 |
en_US.UTF-8 |
美国英语 (UTF-8) |
es_ES.ISO8859-1 |
西班牙语 |
fr_FR.ISO8859-1 |
法语 |
it_IT.ISO8859-1 |
意大利语 |
ja_JP.eucJP |
日语 (EUC) |
ko_KR.EUC |
韩文 (EUC) |
sv_SE.ISO8859-1 |
瑞典语 |
zh_CN.EUC |
简体中文 (EUC) |
zh_TW.EUC |
繁体中文 (EUC) |
有关支持的语言环境的更多信息,请参见《International Language Environments Guide》。
以下示例说明如何使用 LANG 环境变量设置语言环境。在 C shell 用户初始化文件中,可以添加如下内容:
setenv LANG de_DE.ISO8859-1 |
在 Bourne shell 或 Korn shell 用户初始化文件中,可以添加如下内容:
LANG=de_DE.ISO8859-1; export LANG |
创建文件或目录时,为文件或目录指定的缺省文件权限由用户掩码进行控制。用户掩码由用户初始化文件中的 umask 命令设置。可以通过键入 umask 并按回车键来显示用户掩码的当前值。
用户掩码中包含下列八进制值:
第一位用来为用户设置权限
第二位用来为组设置权限
第三位用来为其他实体设置权限(又称作 world)
请注意,如果第一位是零,它将不显示出来。例如,如果用户掩码设置为 022,则将显示 22。
如需确定要设置的 umask 值,请用 666(对于文件)或 777(对于目录)减去所需的权限值。差值就是要用于 umask 命令的值。例如,假设您希望将文件的缺省模式设置为 644 (rw-r--r--),666 与 644 的差值 022 就是将用作 umask 命令参数的值。
还可以使用下表来确定要设置的 umask 值。下表显示了为 umask 的每个八进制值创建的文件权限和目录权限。
表 4–22 umask 权限的值
umask 八进制值 |
文件权限 |
目录权限 |
---|---|---|
0 |
rw- |
rwx |
1 |
rw- |
rw- |
2 |
r-- |
r-x |
3 |
r-- |
r-- |
4 |
-w- |
-wx |
5 |
-w- |
-w- |
6 |
--x |
--x |
7 |
---(无) |
---(无) |
用户初始化文件中的下行用来将缺省的文件权限设置为 rw-rw-rw-。
umask 000 |
以下几节提供用户初始化文件和站点初始化文件的示例,您可以从这些文件开始自定义自己的初始化文件。您需要针对特定的站点更改这些示例中使用的系统名称和路径。
(Line 1) PATH=$PATH:$HOME/bin:/usr/local/bin:/usr/ccs/bin:. (Line 2) MAIL=/var/mail/$LOGNAME (Line 3) NNTPSERVER=server1 (Line 4) MANPATH=/usr/share/man:/usr/local/man (Line 5) PRINTER=printer1 (Line 6) umask 022 (Line 7) export PATH MAIL NNTPSERVER MANPATH PRINTER |
定义用户的 shell 搜索路径。
设置用户邮件文件的路径。
定义用户的 Usenet 新闻服务器。
定义用户的手册页搜索路径。
定义用户的缺省打印机。
设置用户的缺省文件创建权限。
设置所列出的环境变量。
(Line 1) set path=($PATH $HOME/bin /usr/local/bin /usr/ccs/bin) (Line 2) setenv MAIL /var/mail/$LOGNAME (Line 3) setenv NNTPSERVER server1 (Line 4) setenv PRINTER printer1 (Line 5) alias h history (Line 6) umask 022 (Line 7) source /net/server2/site-init-files/site.login |
定义用户的 shell 搜索路径。
设置用户邮件文件的路径。
定义用户的 Usenet 新闻服务器。
定义用户的缺省打印机。
为 history 命令创建别名。用户只需键入 h 即可运行 history 命令。
设置用户的缺省文件创建权限。
以站点初始化文件为来源。
下面的示例显示用户可从中选择特定应用程序版本的站点初始化文件。
# @(#)site.login main: echo "Application Environment Selection" echo "" echo "1. Application, Version 1" echo "2. Application, Version 2" echo "" echo -n "Type 1 or 2 and press Return to set your application environment: " set choice = $< if ( $choice !~ [1-2] ) then goto main endif switch ($choice) case "1": setenv APPHOME /opt/app-v.1 breaksw case "2": setenv APPHOME /opt/app-v.2 endsw |
站点初始化文件可以在用户的 .cshrc 文件(仅限 C shell)中引用,该文件中包含下行:
source /net/server2/site-init-files/site.login |
在该行中,站点初始化文件命名为 site.login 且位于名为 server2 的服务器上。该行还假设用户的系统运行的是自动挂载程序。