Chapter13 - 配置shell 环境
更改 shell 环境
环境变量
shell 和脚本使得变量存储数据;某些变量可以与其内容一起传递到了进程里。这些特殊变量称为环境变量。
应用程序和会话使用这些变量来确定其行为。管理员可能熟悉其中一部分,如PATH ,USER 和 HOSTNAME 等等。使变量成为环境变量的前提是,它们已经在 shell 中导出。标记为导出的变量及其值将传递到从 shell 生成的任何子进程。用户可以使用 env 命令查看在其 shell 中定义的所有环境变量。
shell 中定义的任何变量都可以是环境变量。将变量变成环境变量的关键是使用 export 命令将其标记以进行导出。
在以下示例中,将设备变量 MYVAR 。生成一个子 shell ,并且 MYVAR 变量在子shell 中不存在
[student@dumo~]$ MYVAR="some value"
[student@dumo~]$ echo $MYVAR
some value
[student@dumo~]$ bash
[student@dumo~]$ echo $MYVAR
[student@dumo~]$ exit
在类似的示例中,export 命令将用于将 MYVAR 变更标记为环境变量,后者将传递到子 shell 。
[student@dumo~]$ MYVAR="some value"
[student@dumo~]$ export MYVAR
[student@dumo~]$ echo $MYVAR
some value
[student@dumo~]$ bash
[student@dumo~]$ echo $MYVAR
some value
[student@dumo~]$ exit
bash 启动脚本
使用环境变量是一个场合是在用户登录后初始化 bash 环境。当用户登录时,将执行几个 shell 脚本以初始化其环境,首先是 /etc/profile ,然后是用户的主目录中的配置文件,通常为 ~/.bash_profile 。
注意
bash shell 将在用户的主目录查找以下三个文件之一:.bash_profile 、.bash_login 、或 .profile . shell 将按照给定顺序查找文件,并且将执行其找到的第一个文件。
由于这些配置文件中具有额外的脚本(该脚本调用其他shell脚本 ).因此 bash 登录脚本通常如下:
/etc/profile
\_/etc/profile.d/*.sh
~/.bash_profile
\_~/.bashrc
\_/etc/bashrc
一般来说,有两种类型的登录脚本:配置文件和“RC”。配置文件用于设备和导出环境变量以及运行仅应在登录后运行的命令。RC(如 /etc/bashrc)用于运行命令,设置别名,定义函数以及无法导出到子shell 的其他设置,通常,配置文件仅在登录 shell 中执行,而每次创建 shell 时执行 RC ,无论是登录还是非登录。
文件调用的布局是用户可以覆盖系统范围脚本提供的默认设置,红帽提供的很多配置文件将包含一个注释,指示应添加用户特定更改的位置。
使用 alias
通过 alias 管理员或用户可以向系统定义自己的命令或者覆盖现在系统命令的使用。将在用于检查 PATH 的 shell 之前解析和替换别名。 alias 还可以用于显示 shell 中定义的所有现有别名。
[root@rhel ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@rhel ~]#
用户环境中定义的所有默认别名均位于先前显示的 alias 输出中。 ll 别名的定义表示,当用户输入 ll 作为命令时 shell 将扩展别名并执行 ls -l –color=auto.这样,新命令 ll 便添加到 shell 。在另一个示例中是 grep 的别名,该别名覆盖系统上现有命令的默认调用。当用户输入 grep 命令时, shell 将展开别名并替换为 grep –color=auto 命令。由于别名,因此所有对 grep 的调用将被覆盖,成为对自动传递了 –color 选项的 grep 的调用。
使用 alias 命令来设置别名,定义的别名仅在当前 shell 的持续期间存在。
alias mycomm="<command to execute>"
[root@host ~]# alias usercmd='echo "Hurrah!";ls -l'
[root@host ~]# usercmd
Hurrah!
total 2840
-rw-r--r-- 1 root root 139 Oct 9 2018 addomain.sh
-rw-r--r-- 1 root root 163 Oct 9 2018 addusr.sh
要将别名持久化,用户需要在其 ~/.bashrc 的底部添加该命令。
[student@demo]$ vi ~/.bashrc
……
#User specific aliases and functions
alias usercmd='echo "Hurrah!";ls -l'
在 alias 添加到 ~/.bashrc 之后,该命令将在创建的每个 shell 中可用。
要从环境中删除某个别名,请使用 unalias 命令
使用环境函数
在 shell 脚本中使用时,函数是的种隔离代码段的方法,以便可以重复调用代码段而无须重新编写整个代码段。此外,如果代码需要更新,可以更新函数的内容,在引用了函数的所有位置中,现在都会执行更新后的代码。
以下是在 shell 脚本中定义和使用函数的示例,选自 /etc/profile 。 pathmunge 函数采用两个参数;第一个参数表示目录,第二个(可选)是单词 “after”。根据是否作为 $2 传递,目录将添加到目录现有列表开头或结尾的 PATH 环境变量中,之后 ,将多次调用函数以便为 root 用户或常规用户构建 PATH 。请注意,对于 root 用户,所有目录都添加到 PATH 的前面,而对于常规用户,则是通过附加的试来构建其PATH
pathmunge(){
if [ "$2" = "after" ];then
PATH=$PATH:$1
else
PATH=$1:PATH
fi
}
……
if [ "$EUID" = "0" ];then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
pathmunge /sbin after
fi
还可以在 bash shell 环境中设置函数。在环境中设置时,函数可以在命令行中作为命令来执行,类似于别名。与别名不同的是,函数可以采用参数,在操作方面比别名复杂得多,并且提供返回代码。可通过在命令行中输入函数而在当前 shell 中定义函数,但实际上,应在用户的 ~/.bashrc 或全局 /etc/bashrc 中设置函数。
用户环境中默认已经设置了很多函数 ,可以使用 set 命令来查看。set 将显示当前 shell 环境中所有函数和变量。要从环境中删除某个函数,用户或管理员可以使用 unset 命令,同时传递要删除的函数或变量名称。