bash初始化文件详解

本文使用的环境: Bash 4.2.46

bash启动时会执行一系列脚本, 具体要执行哪些启动文件, 这和bash的类型有关: 是否为交互式(interactive)的shell, 是否为登录式(login)的shell

  • 日常使用ssh登录的shell是交互式shell
  • 图形化界面下打开的terminal也是交互式shell
  • 通过 bash script.sh./script.sh执行脚本时, 会创建一个子shell来执行此脚本, 此时的 子shell为非交互式shell
  • 通过ssh远程执行命令的shell为非交互式shell

$-会输出set设置的一些选项, 输出结果结果中的 i表示interactive(但不能通过set设置是否为交互式)

脚本中判断是否为交互式shell
case "$-" in
  *i*) echo 'This shell is interactive' ;;
  *) echo 'This shell is not interactive' ;;
esac
此时为交互式shell
$ echo $-
himBHs

执行脚本时创建的子shell为非交互式shell
$ 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
  • 通过 bash -lsu -l命令启动的为登录式shell
  • 通过ssh登录的shell为登录式shell
  • 通过ssh远程执行命令的shell为非登录式shell
  • 图形化界面下启动的”terminal”默认为非登录式的, 但是可以更改为登录式shell
    bash初始化文件详解

可通过 shopt命令来查看是否为登录式shell, 也可以通过此命令来转换登录式/非登录式shell

$ shopt login_shell
login_shell    off

了解了什么是交互式/登录式shell之后, 我们来看下这4种情况下shell的初始化文件

涉及到的文件主要有: /etc/profile, ~/.profile, ~/.bash_profile, ~/.bash_login, ~/.bashrc

echo [/etc/profile]添加到/etc/profile的 第一行(其他文件同理), 根据每次登录服务器时的输出就能看到哪些文件被执行了

交互登录式shell初始化的文件为:

  • /etc/profile
  • ~/.bash_profile, ~/.bash_login, and ~/.profile 这三个文件只会执行其中一个, 找到其中一个别的就不执行了, 优先级从前往后递减

通过ssh的方式登录即可得到交互登录式shell

$ ssh wbourne@192.168.0.101
[/etc/profile]
[~/.bash_profile]
[~/.bashrc]

再来验证~/.bash_profile, ~/.bash_login, and ~/.profile这三个文件的优先级

将~/.bash_profile改名为~/.bash_profile.bak, 再次登录服务器, 可以看到, ~/.bash_profile没有被执行, 取而代之的是~/.bash_login

$ ssh wbourne@192.168.0.101
[/etc/profile]
[~/.bash_login]

执行完成之后, 为了不影响后续测试, ~/.bash_profile.bak改回~/.bash_profile

交互非登录式shell初始化的文件为:

  • *~/.bashrc

通过 su命令切换用户即可得到交互非登录式shell

$ ssh root@192.168.0.101
$ su wbourne
[~/.bashrc]

通过 su切换用户后, 按下Tab键发现自动补全用不了, 是因为/etc/profile中有以下一段脚本, 而自动补全与/etc/profile.d中的脚本有关

可以将这一段添加到~/.bashrc文件中, 就可以使交互式shell都能够自动补全, 至于为什么, 会在4.2 ~/.bashrc中讲到

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

非交互非登录式shell初始化的文件为:

  • 查找 $BASH_ENV变量并执行, 就像 if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi一样

bash xxx.sh所创建用来执行脚本的子shell为非登录非交互式shell

登录服务器时的shell是交互登录式shell
$ ssh wbourne@192.168.0.101
[/etc/profile]
[~/.bash_profile]
[~/.bashrc]

编写一个脚本并执行, 执行脚本时创建的子shell才是非交互非登录shell
此处只有脚本本身的输出, 没有任何初始化文件被执行
$ cat script.sh
echo "$-"
echo "$BASH_ENV"
shopt login_shell

$ bash script.sh
hB

login_shell     off

设置 $BASH_ENV变量, 再次测试, 可以看到, ~/.bashrc被执行

$ export BASH_ENV='~/.bashrc'

$ bash script.sh
[~/.bashrc]
hB
~/.bashrc
login_shell     off

测试完之后执行 unset BASH_ENV删除BASH_ENV变量, 以免影响带后续测试

非交互登录式shell初始化的文件为:

  • /etc/profile
  • ~/.bash_profile, ~/.bash_login, and ~/.profile 同上, 三取其一
  • 查找 $BASH_ENV变量并执行, 就像 if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi一样

bash xxx.sh的基础上加上 -l选项可得到登录非交互式shell

$ cat script.sh
echo "$-"
echo "$BASH_ENV"
shopt login_shell

$ bash -l script.sh
[/etc/profile]
[~/.bash_profile]
[~/.bashrc]
hB

login_shell     on

再验证下 $BASH_ENV. 注意, .bashrc输出了两次, 4.2 ~/.bashrc会讲到为什么

$ export BASH_ENV='~/.bashrc'

$ bash -l script.sh
[/etc/profile]
[~/.bash_profile]
[~/.bashrc]
[~/.bashrc]
hB
~/.bashrc
login_shell     on

大部分发行版还会涉及/etc/bash.bashrc与/etc/bashrc这两个文件, 例如Ubuntu 18.04 Desktop的/etc/profile文件中有 . /etc/bash.bashrc的语句, CentOS 7 Server的~/.bashrc文件中有 . /etc/bashrc的语句

上述例子中, 只有交互非登录shell才会调用~/.bashrc, 但是其他例子的输出也包含了~/.bashrc, 甚至有的执行了两次, 这是因为:

一般的发行版中, ~/.profile文件中一般都有 . ~/.bashrc的语句, 以此来保证无论是登录式shell还是非登录式shell, ~/.bashrc都会被执行. 换句话说, 只要是交互式shell, ~/.bashrc都会被执行

Original: https://www.cnblogs.com/wbourne/p/15228515.html
Author: 王bourne
Title: bash初始化文件详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581767/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • go-select 机制

    select 的用法与 switch 语言非常类似,由 select 开始一个新的选择块,每个选择条件由 case 语句来描述。 与 switch 语句相比,select 有比较多…

    Linux 2023年6月13日
    0102
  • 位运算(一)

    位运算的一般应用 功能 例子 运算 去掉最后一位 1110101->111010 x>>1 在最后加0 1110101->11101010 x< 通过…

    Linux 2023年6月8日
    0145
  • ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

    本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用 (ASP.NET Core 系列目录)。 系统环境为CentOS 8 。 一、概…

    Linux 2023年6月7日
    0110
  • 【设计模式】Java设计模式-原型模式

    【设计模式】Java设计模式 – 原型模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆原创作品,更多关注我CSDN: 一个…

    Linux 2023年6月6日
    0129
  • Linux Ubuntu 下载&安装 MySQL

    1. 下载安装 下载&安装:一句搞定 sudo apt update sudo apt install mysql-server 查看版本信息 mysql –versio…

    Linux 2023年6月14日
    0107
  • 复杂任务中,流程的解耦设计

    做事不能急,得一步异步的来; 一、业务场景 在系统开发的过程中,必然存在耗时极高的动作,是基于请求响应模式无法解决的问题,通常会采用解耦的思维,并基于异步或者事件驱动的方式去调度整…

    Linux 2023年6月14日
    074
  • 利用卷积神经网络处理cifar图像分类

    这是一个图像分类的比赛CIFAR( CIFAR-10 – Object Recognition in Images ) 首先我们需要下载数据文件,地址: http://…

    Linux 2023年6月6日
    0121
  • Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 一、用git –version命令检查是否已经安装 二、下载git源码并解压 wget https:/…

    Linux 2023年5月27日
    0136
  • 部署前后端为独立的 Docker 节点

    在『服务器部署 Vue 和 Django 项目的全记录』一文中,介绍了在服务器中使用 Nginx 部署前后端项目的过程。然而,当 Web 应用流量增多时,需要考虑负载均衡、流量分发…

    Linux 2023年6月7日
    0123
  • 应用配置管理,基础原理分析

    工程可以有点小乱,但配置不能含糊; 一、配置架构 在微服务的代码工程中,配置管理是一项复杂的事情,即需要做好各个环境的配置隔离措施,还需要确保生产环境的配置安全;如果划分的微服务足…

    Linux 2023年6月14日
    0119
  • 基于 OSPF 路由的邻居邻接关系发现实践

    1、实验目的 理解 OSPF 邻居关系和 OSPF 邻接关系的含义及差别 观察 OSPF 邻居邻接关系的建立过程 观察 OSPF 链路状态数据库的同步过程 2、实验原理 OSPF …

    Linux 2023年6月8日
    0137
  • 分布式中灰度方案实践

    让请求在导航的服务节上点执行; 一、背景简介 分布式系统中会存在这样的开发场景,不同需求可能涉及到对同一个服务的开发,那么该服务在研发期间就会存在多个版本并行的状态,为了保持不同版…

    Linux 2023年6月14日
    0121
  • vsftpd 操作手册-完整版

    vsftpd 目录 – ftp 简介 – vsftpd 简介 – vsftpd 安装&卸载 – vsftpd 配置文件 – vsftpd 认证模板 – vsftpd 配置模…

    Linux 2023年6月13日
    089
  • [转]最值得拥有的免费Bootstrap后台管理模板

    Original: https://www.cnblogs.com/haowuji/p/7490519.htmlAuthor: 下-个路口Title: [转]最值得拥有的免费Boo…

    Linux 2023年6月13日
    0112
  • redis主从复制

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 特性: 运行在内存中的数据集工作方式 支持多种数据结构 提供不同级别的磁盘持…

    Linux 2023年5月28日
    087
  • 【原创】Linux虚拟化KVM-Qemu分析(一)

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年6月8日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球