bash初始化文件详解
目录
本文的环境: Ubuntu 18.04 Server + Bash 4.4.20
bash启动时会执行一系列脚本, 具体要执行哪些启动文件, 这和bash的类型有关: 是否为交互式(interactive)的shell, 是否为登录式(login)的shell
1. 交互式(interactive)shell/非交互式(non-interactive)shell
1.1 如何启动一个交互式shell/非交互式shell
- 日常使用ssh登录的shell是交互式shell
- 图形化界面下打开的terminal也是交互式shell
- 通过
bash script.sh
或./script.sh
执行脚本时, 会创建一个子shell来执行此脚本, 此时的shell为非交互式的 - 通过ssh远程执行命令的为非交互式
1.2 如何判断是否为交互式shell
$-
会输出set设置的一些选项, 输出结果结果中的i
表示interactive(但实际上不能通过set设置是否为交互式)
case "$-" in
*i*) echo 'This shell is interactive' ;;
*) echo 'This shell is not interactive' ;;
esac
$ echo $-
himBHs
$ cat script.sh
echo "$-"
$ bash script.sh
hB
在非交互式shell不会设置PS1, 所以通过PS1是否有值判断也是可行的
if [ -z "$PS1" ]; then
echo 'This shell is not interactive'
else
echo 'This shell is interactive'
fi
2. 登录式(login)shell/非登录式(non-login)shell
2.1 如何启动一个登录式shell/非登录式shell
通过bash --login
或su -l
命令启动的为登录式shell
通过ssh连接的为登录式shell
通过bash
命令启动的为非登录式shell
通过ssh远程执行命令的为非登录式shell
图形化界面下启动的"terminal"默认为非登录式的, 但是可以更改为登录式shell
2.2 如何判断是否为登录式shell
可通过shopt
命令来查看是否为登录式shell, 也可以通过此命令来转换登录式/非登录式shell
$ shopt login_shell
login_shell off
3. 启动文件
了解了什么是交互式/登录式shell之后, 我们来看下这2*2种情况下shell的初始化文件
3.1 测试方法
涉及到的文件主要有: /etc/profile, /etc/bash.bashrc, ~/.profile, ~/.bashrc, ~/.bash_logout
准备两个用户, 因为需要切换用户
将echo "$(date '+%H:%M:%S:%N') $(whoami) /etc/profile" >>/home/ba/log
添加到上述五个文件的第一行(后三个文件第二个用户也要修改)
由于涉及到.bash_logout文件, 此文件是在退出bash的时候才执行, 如果只连接一次服务器, 推出后再登录看日志, 会把第二次登录的结果也带到日志中, 不太严谨
所以应该开两个窗口连上服务器, 第一个窗口执行tail -f /home/ba/log
观察日志, 第二个窗口可以随意登录推出和执行命令
3.2 交互登录(interactive login) shell
交互登录式shell初始化的文件为:
- /etc/profile
- ~/.bash_profile, ~/.bash_login, and ~/.profile 这三个文件只会执行其中一个, 找到其中一个别的就不执行了, 优先级从前往后递减
- ~/.bash_logout
通过ssh的方式登录即可得到交互登录式shell
$ ssh ba@......
$ logout
# log
### /etc/profile文件中有 . /etc/bash.bashrc 的语句, 所以/etc/bash.bashrc也被执行了
### 同样, ~/.profile中也有 . ~/.bashrc 的语句
### 注意: 不同的发行版, 不同的shell, 默认情况下对于/etc/bash.bashrc可能会存在差异, 有些bash是通过~/.bashrc来执行 . /etc/bash.bashrc
13:35:47:304181923 ba /etc/profile
13:35:47:309532807 ba /etc/bash.bashrc
13:35:47:353487400 ba ~/.profile
13:35:47:358734199 ba ~/.bashrc
13:36:14:812344118 ba ~/.bash_logout
再来验证~/.bash_profile, ~/.bash_login, and ~/.profile这三个文件的优先级
$ ssh ba@......
$ vim .bash_profile
$ cat .bash_profile
echo "$(date '+%H:%M:%S:%N') $(whoami) ~/.bash_profile" >>/home/ba/log
$ logout
# log
### ~/.profile连带着~/.bashrc都没有了, 取而代之的是~/.bash_profile
13:53:07:178921031 ba /etc/profile
13:53:07:183184595 ba /etc/bash.bashrc
13:53:07:211623026 ba ~/.bash_profile
13:53:12:253835053 ba ~/.bash_logout
执行完成之后, 我删除了~/.bash_profile, 后续章节都不涉及~/.bash_profile
3.3 交互非登录(interactive non-login) shell
交互非登录式shell初始化的文件为:
- /etc/bash.bashrc
- ~/.bashrc
通过su
命令切换用户即可得到交互非登录式shell
$ ssh ba@......
$ su root
$ echo $-
himBHs
$ shopt login_shell
login_shell off
# log
14:04:53:515775025 root /etc/bash.bashrc
14:04:53:522999498 root ~/.bashrc
通过su
切换用户后, 按下Tab键发现自动补全用不了, 是因为/etc/profile中有以下一段, 而自动补全与/etc/profile.d中的脚本有关, 将以下内容移动到/etc/bash.bashrc或~/.bashrc, 即可保证交互式shell可以完成自动补全
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
3.4 非交互非登录(non-interactive non-login) shell
非交互非登录式shell初始化的文件为:
- 查找
$BASH_ENV
变量并执行, 就像if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
一样
bash xxx.sh
所创建用来执行脚本的子shell为非登录非交互式shell
$ ssh ba@......
$ cat script.sh
echo "$-"
echo "$BASH_ENV"
shopt login_shell
$ bash script.sh
hB
login_shell off
# log 无输出
设置$BASH_ENV
变量
$ export BASH_ENV='~/.bashrc'
$ bash script.sh
hB
~/.bashrc
login_shell off
# log
13:57:00:355294304 ba ~/.bashrc
3.5 非交互登录(non-interactive login) shell
非交互登录式shell初始化的文件为:
- /etc/profile
- ~/.bash_profile, ~/.bash_login, and ~/.profile
- ~/.bash_logout
- 查找
$BASH_ENV
变量并执行, 就像if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
一样
在bash xxx.sh
的基础上加上--login
选项可得到登录非交互式shell
$ ssh ba@......
$ bash --login script.sh
hB
login_shell on
# log
13:59:14:886387539 ba /etc/profile
13:59:14:894341293 ba ~/.profile
13:59:14:897853694 ba ~/.bashrc
虽然此处也是登录式shell, 为何没有/etc/bash.bashrc? 因为在/etc/profile中有如下一段, 只有在交互式shell才执行/etc/bash.bashrc
if [ "${PS1-}" ]; then
...
. /etc/bash.bashrc
fi
再验证下$BASH_ENV
. 注意, .bashrc输出了两次, 一次是.profile调用, 一次是$BASH_ENV
的作用
$ export BASH_ENV='~/.bashrc'
$ bash --login script.sh
hB
~/.bashrc
login_shell on
# log
14:03:35:455306977 ba /etc/profile
14:03:35:461542280 ba ~/.profile
14:03:35:465203982 ba ~/.bashrc
14:03:35:469716368 ba ~/.bashrc
4. 参考
bash初始化文件详解的更多相关文章
- 【转】linux中inittab文件详解
原文网址:http://www.2cto.com/os/201108/98426.html linux中inittab文件详解 init的进程号是1(ps -aux | less),从这一点就能看出, ...
- web.xml文件详解
web.xml文件详解 Table of Contents 1 listener. filter.servlet 加载顺序 2 web.xml文件详解 3 相应元素配置 1 listener. f ...
- jni.h头文件详解二
作者:左少华 博客:http://blog.csdn.net/shaohuazuo/article/details/42932813 转载请注明出处:http://blog.csdn.net/shao ...
- Linux - CentOS6.5服务器搭建与初始化配置详解(上)
1.新建一个虚拟机 选择典型 单机下一步 p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: ...
- 【转】 jni.h头文件详解(二)
原文网址:http://blog.csdn.net/shaohuazuo/article/details/42932813 作者:左少华 博客:http://blog.csdn.net/shaohua ...
- Linux - CentOS6.5服务器搭建与初始化配置详解(下)
传送带:Linux - CentOS6.5服务器搭建与初始化配置详解(上) 继续接着上面的安装,安装完后会出现下面界面 点击reboot重启 重启后可以看到下面的tty终端界面 因为这就是最小化安装 ...
- PE文件详解(六)
这篇文章转载自小甲鱼的PE文件详解系列原文传送门 之前简单提了一下节表和数据目录表,那么他们有什么区别? 其实这些东西都是人为规定的,一个数据在文件中或者在内存中的位置基本是固定的,通过数据目录表进行 ...
- PE文件详解(三)
本文转自小甲鱼的PE文件详解系列传送门 PE文件到内存的映射 在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制. 也就是说,windows ...
- /etc/inittab文件详解
/etc/inittab由/sbin/init程序解析调用,用于系统初始化,/sbin/init可参考源码busybox中init.c的实现方式. 原址如下: http://leejia.blog.5 ...
随机推荐
- Solon 开发,三、构建一个Bean的三种方式
Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...
- 深入理解http1.x、http 2和https
转自 https://segmentfault.com/a/1190000015316332 一.HTTP/1.x Http1.x 缺陷:线程阻塞,在同一时间,同一域名的请求有一定数量限制,超过限制数 ...
- 很详细的FFT(快速傅里叶变换)概念与实现
FFT 首先要说明一个误区,很多人认为FFT只是用来处理多项式乘的,其实FFT是用来实现多项式的系数表示法和点值表示法的快速转换的,所以FFT的用处远不止多项式乘. FFT的前置知识:点值表示法,复数 ...
- linux面试题(重点)
1.No space left on device ,但df -h,磁盘空间还很富余?原因是 Inode 耗尽.可以使用df -i检查.磁盘中中产生了很多小的临时文件,造成在磁盘空间耗尽之前文件系统的 ...
- linux文件压缩与文件夹压缩(打包)
目录 一:linux文件压缩 1.linux常见的压缩包有哪些? 2.bzip压缩(文件) 二:打包(文件夹压缩) 1.打包命令 2.参数 3.参数解析(实战) 4.注意事项 简介: win中的压缩包 ...
- How to check in Windows if you are using UEFI
You might be wondering if Windows is using UEFI or the legacy BIOS, it's easy to check. Just fire up ...
- linux apache软件安装
安装提示 Linux下,源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). 过程中用到"configure --prefix=安装 ...
- spring 整合shiro框架 模拟登录控制器。
一.导入shiro jar包. 我在maven项目中,将常用的jar包都放在里面. <?xml version="1.0" encoding="UTF-8&qu ...
- new操作符具体干了什么呢?
考察对new关键的深刻认识,是否对前端知识有专研,如果没有专研的人,肯定说创建了一个对象,恭喜你面试官知道你是小菜鸟来的,这次面试基本上没有太大的希望了.一定要对new过程的4个步骤非常清楚,这样才能 ...
- Python property动态属性
from datetime import datetime, date class User: def __init__(self, name, birthday): self.name = name ...