背景:搞docker用不同的指令, 通过三条指令分别去查看当前env,env不同,于是去研究bash的四种不同启动方式和文件读取
docker run -it image env
docker run -it image bash , env
docker run -dt --name test image bash, docker run -it test bash, env
bash有四种登录方式:
login non-login interactive non-interactive
login & non-login:
login:在输入了账号密码的情况,或者打开bash使用参数bash -l / --login,login状态下,bash默认加载/etc/profile和~/.profile文件
不同内核的linux系统在读取文件上会稍有差异
nonlogin: 用户在登录状态下运行的其他shell,读取/etc/bashrc ~/.bashrc
可以通过 shopt login_shell 命令查看当前是否login状态,on为login,off为非login
/etc/profie 文件配置了全局变量,对所有用户生效,会在用户登录时读取该文件
/etc/bashrc 每次加载bash时,会读取该文件 ~/.bashrc存放个人相关的设置

non-internative & interactive
interactive:需要通过键盘交互,自行exit,读取/ect/bashrc ~/.bashrc
non-interactive:可能是自动化进程中运行的子shell,执行完指令直接自动退出为非交互式,自动运行因此最好将输出写入日志文件。非交互式shell通常是非登录的,因为调用的用户已经登陆了。一些shell会读取$ENV,不会读取bahsrc和profile
echo $- 如果输出的值包含i,说明当前的bash为交互式
echo $PS1 非空则为交互式,空值是交互式,因为非交互式会清空PS1 的值
PS1 用来定义命令行提示符, 可以修改时间 颜色等
通过不同方式打开的bash,会加载读取不同的配置文件,ENV就会不同
不同组合的登录方式
docker run -it image env
# noninteractive + nonlogin 执行完env会自动退出
docker run -dt --name test image bash, docker run -it test env
# docker指令在bash中执行,所以是当前bash的子进程,也就是nonlogin
# 同时执行完env后自动退出,是non-interactive。不会去读取profile bashrc等配置文件
docker run -it image bash , env
# internative + nonlogin 打开bash 自行输入env 执行完成后如需退出需要自己exit
本文探讨了bash的四种启动方式:login non-login、interactive non-interactive,并详细解析了它们如何加载配置文件如/etc/profile、~/.profile、/etc/bashrc和~/.bashrc。内容涉及在不同登录状态下bash的行为,以及如何通过shopt login_shell检查登录状态。此外,还提到了交互式和非交互式shell的区别,以及如何通过$-和$PS1变量来判断bash的类型。
835

被折叠的 条评论
为什么被折叠?



