Linux 用户配置与环境变量

配置登录与欢迎信息

通过终端 tty(teletypewriter)登录后的显示信息在 /etc/issue 配置,telnet 的在 /etc/issue.net,通告在 /etc/motd 目录:

[root@101c7 ~]$ cat /etc/issue
\S
Kernel \r on an \m

可以使用反斜杠调用变量,自定义显示登录后显示信息。

Bash 环境变量配置文件

为了让自定义变量和别名在登录时便已准备好,可以将它们写入到配置文件。

交互式 shell 有两种类型:

  • 登录 shell(login shell

    取得 bash 时需要完整登录流程,比如通过 ssh 登录,通过 su -l 命令切换用户。

  • 非登录 shell(non-login shell

    取得 bash 接口的方法不需要重复登录,也叫做交互式 shell。比如在原本的 bash 环境下再执行的 bash,或使用 su 命令直接切换用户。

还有一种 shell 是非交互式 shell,系统执行 shell 脚本时用的就是这种 shell。可以通过 BASH_ENV 环境变量来设置一些初始值。

login shell

下面两个文件只有 login shell 能读取:

  • /etc/profile

    保存着系统整体的设置,对所有用户都有效。设置的主要变量有:

    • PATH:依据 UID 决定 PATH 变量要不要含有 sbin 的系统命令目录;
    • MAIL:依据账号设置好用户的 mailbox 到 /var/spool/mail/账号名;
    • USER:根据用户的账号设置此变量内容;
    • HOSTNAME:依据主机的 hostname 命令决定此变量内容;
    • HISTSIZE:历史命令记录条数;
    • 调用 /etc/profile.d/*.sh 中的脚本,里面存放了比如 ll 与 ls 命令的别名,颜色配置等;
    • 调用 /etc/locale.conf 来决定 bash 使用的语言;
    • 调用 /usr/share/bash-completion/completions/* 下面和参数补齐有关的脚本。

    不建议修改这个文件,因为此文件内容会随着系统更新而自动更新。

  • ~/.bash_profile(或 bash_login,profile)

    保存着用户的个人设置。默认设置有:

    • PATH:定义了用户主文件夹 ~/bin/ 为额外的执行文件放置目录,并且设为了环境变量;
    • 调用 ~/.bashrc 的设置内容,一般个性化配置写在 .bashrc 中。

一般来说,上两文件中适合记录:

  • 创建或修改环境变量的命令,例如 PATH 变量,umask 设置等。
  • 执行所有一次性操作的命令。

non-login shell

non-login shell 仅会读取 ~/.bashrc 文件:

  • ~/.bashrc

    以 rc 结尾的隐藏配置文件,代表 run commands,也就是特定程序每次启动时自动运行的命令。bashrc 会调用 /etc/bashrc 这个文件,主要根据不同 UID 规定了 umask 值,PS1 变量。

其他一些配置文件:

  • ~/.bash_history

    记录历史命令。记录的数量与 HISTSIZE 变量有关。

  • ~/.bash_logout

    记录当注销 Bash 后进行的操作,可以自己加入一些命令(如清空 /tmp)在其中。

读入环境配置文件

通常修改了 .bashrc 文件配置后,需要注销登录才会生效。也可以利用 source 命令让配置文件立即生效。

例如让 /etc/profile 配置文件立马生效:

[root@101c7 ~]$ source /etc/profile

使用小数点(.)也可以达到同样效果:

[root@101c7 ~]$ . ~/.bash_profile 

利用这个特性,可以将多个配置文件定义不同环境变量,需要切换时用 source 运行使其立刻生效。

终端机和环境设置

我们可以使用 stty 命令来设置终端机的输入按键代表意义。

首先,查看所有可设置参数:

[root@101c7 ~]$ stty -a
speed 38400 baud; rows 20; columns 107; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

其中,有几个比较重要的设置如下:

字符 含义
eof end of file 代表文件结束,输入终止。
erase 向后删除字符。
intr 向当前正在运行的程序发送一个中断信号(interrupt)。
kill 删除当前命令行上的所有文字。
quit 向当前正在运行的进程发送一个 quit 信号。
start 重新启动当前屏幕的输出显示。
stop 停止当前屏幕的输出显示。
susp 向正在运行的进程发送一个 terminal stop 信号。

^ 代表 Ctrl 键,我们可以自定义按键。例如,将删除字符的组合键设置为 Ctrl+9:

[root@101c7 ~]$ stty erase ^9

除了 stty,还有 set 命令可以设置一些终端机设置值。我们可以使用 set -o 来查询可用选项:

[root@server3 ~]$ set -o
allexport       off
braceexpand     on
emacs           on