009.配置文件定制bash

在命令行中输入的绝大部分命令都可以放置在一个特殊的文件中,留待登录或启动新的bash会话时执行。将函数定义、别名以及环境变量设置放置在这种特殊文件中,是一种定制shell的常用方法。

复制代码
# 定义ls命令使用的颜色
LS_COLORS='no=00:di=01;46:ln=00;36:pi=40;33:so=00;35:bd=40;33;01'
export LS_COLORS

# 主提示符
PS1='Hello $USER'; export PS1

# 正常路径之外的个人应用程序安装目录
PATH=$PATH:/opt/MySpecialApplication/bin; export PATH

# 常用命令的便捷方式
function lc () {/bin/ls -C $* ; }

Linux和Unix中能够放置定制脚本的文件不止一个。这些配置文件分为3类:登录时执行的、启动交互式shell时执行的以及调用shell处理脚本文件时执行的。

当用户登录shell时,会执行下列文件:

复制代码
/etc/profile, $HOME/.profile, $HOME/.bash_login, $HOME/.bash_profile /
  • **注意:**如果你是通过图形化登录管理器登入的话,是不会执行/etc/profile、HOME/.profile和HOME/.bash_profile这3个文件的。这是因为图形化窗口管理器并不会启动shell。当你打开终端窗口时才会创建shell,但这个shell也不是登录shell。
  • 如果.bash_profile或.bash_login文件存在,则不会去读取.profile文件。

交互式shell(如X11终端会话)或ssh执行单条命令(如ssh 192.168.1.1 ls /tmp)时,会读取并执行以下文件:

复制代码
/etc/bash.bashrc $HOME/.bashrc

如果运行如下脚本:

复制代码
#!/bin/bash

echo "Running

不会执行任何配置文件,除非定义了环境变量BASH_ENV:

复制代码
export BASH_ENV=~/.bashrc
./myscript.sh

使用ssh运行下列命令时:

复制代码
ssh 192.168.1.100 ls /tmp
  • 会启动一个bash shell,读取并执行/etc/bash.bashrc和$HOME/.bashrc,但不包括/etc/profile或.profile。

如果调用ssh登录会话:ssh 192.168.1.100

这会创建一个新的登录bash shell,该shell会读取并执行以下文件:

复制代码
/etc/profile
/etc/bash.bashrc
$HOME/.profile or .bashrc_profile

**危险:**像传统的Bourne shell、ash、dash以及ksh这类shell,也会读取配置文件。但是这些shell并不支持线性数组(列表)和关联数组。因此要避免在/etc/profile或$HOME/.profile中使用这类不支持的特性。

可以使用这些文件定义所有用户所需要的非导出项(如别名)。例如:

复制代码
alias l "ls -l"

/etc/bash.bashrc /etc/bashrc

也可以用来保存个人配置,比如设置需要由其他bash实例继承的路径信息,就像下面这样:

复制代码
CLASSPATH=$CLASSPATH:$HOME/MyJavaProject; export CLASSPATH
$HOME/.bash_login $HOME/.bash_profile $HOME/.profile
  • 如果.bash_login或.bash_profile存在,则不会读取.profile。不过其他shell可能会读取该文件。

另外还可以保存一些需要在新shell创建时定义的个人信息。如果你希望在X11终端会话中能够使用别名和函数的话,可以将其定义在$HOME/.bashrc和/etc/bash.bashrc中。

导出变量和函数会传递到子shell中,但是别名不会。你必须将BASH_ENV的值设置为.bashrc或.profile,然后在其中定义别名,这样就可以在shell脚本中使用这些别名了。

当用户登出会话时,会执行下列文件:

复制代码
	$HOME/.bash_logout

例如,远程登录的用户需要在登出的时候清屏:

复制代码
cat ~/.bash_logout
# 远程登出之后清屏
Clear
相关推荐
xbzb5 小时前
Shell 函数:语法、传参与递归调用一次讲透
shell·递归·函数·调用·传参·递归调用
东鹏特饮2 天前
15个实用Linux运维脚本
linux·运维·shell·脚本·redhat·常用生产脚本
Zoom2 天前
【开源】7 天,我用 Rust 复刻了 FinalShell!Rhost v1.0.0 发布
rust·electron·shell
Lsetea11 天前
OpenSSL s_client退出码为0却证书验证失败:严格校验与Shell管道排查
https·shell·ssl证书·openssl·tls
fox_charon12 天前
Windows 下 CLI 参数的引号陷阱:为什么 --resume 'uuid' 会失败
windows·shell·cmd·cli·引号
吴声子夜歌21 天前
Shell编程实例——编写安全的shell脚本(二)
linux·运维·shell
吴声子夜歌22 天前
Shell编程实例——内务及管理任务(一)
linux·运维·shell
吴声子夜歌22 天前
Shell编程实例——高级脚本编程(一)
linux·运维·网络·shell
吴声子夜歌23 天前
Shell编程实例——bash的配置与自定义(二)
linux·运维·shell
吴声子夜歌23 天前
Shell编程实例——与解析相关的任务(二)
linux·运维·shell