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)

大家都在看

  • DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色

    本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用。本文属于入门级博客,期望本文能让大…

    Linux 2023年6月6日
    089
  • phpcms搜索给分页代码添加参数方法

    在使用PHPCMS开发网站时遇到了一个搜索功能,需要在搜索结果分页链接上添加一些传递的参数,不然不能够正确翻页。 方法: 找到\phpcms\libs\functions\glob…

    Linux 2023年6月13日
    0104
  • SQL51 查找字符串中逗号出现的次数

    本题链接本题表结构如下所示。 +—-+————–+ | id | string | +—-+————–+ | 1 | 10,A,B | …

    Linux 2023年6月13日
    095
  • Linux文件属性及权限

    Linux文件属性及权限 首先我们以root用户的身份登录linux,执行ls -al 查看文件: 文件类型: 【d】 代表目录(directory)、【-】代表文件、【l】代表链…

    Linux 2023年6月11日
    091
  • Struts2-045漏洞

    前言 Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图…

    Linux 2023年6月14日
    099
  • anaconda创建虚拟环境

    anaconda创建虚拟环境 1·查看当前存在的虚拟环境 conda env list 或者 conda info -e 2·创建虚拟环境,环境名重要 conda create -…

    Linux 2023年6月14日
    097
  • java调用python的惨痛史(无法获取环境变量)

    环境:java,was,python2.6,红帽linux,oracle,python用cx_Oracle事情是这样的,有个需求,需要对数据库进行处理,简单说就是把数据取出来,用p…

    Linux 2023年6月6日
    080
  • Django 如何获取 Model 字段列表?

    在平时的开发过程中,避免不了需要获取 Model 中的字段列表。 那需要把所有字段都再复制一份吗?这样的话就太麻烦了,而且后期也不好维护。 其实,Django 内置了一个方法,可以…

    Linux 2023年6月7日
    0113
  • Git

    什么是Git Git是用C语言开发的分布式版本控制系统,所谓版本控制系统,就是可以储存一个文件在不同时间的版本,记录每次文件的改动,可以根据需要,随时切换到之前的版本(比如在编写W…

    Linux 2023年6月7日
    097
  • 快速构建Web应用,从零学习React后台项目模版

    想要快速构建实际应用,离不开一个好的应用模版,React作为大厂出品工具,有着稳定性和可维护性的保障,同时可以使用相关的全套全家桶(React + React-router + A…

    Linux 2023年5月27日
    090
  • pyQt中的信号

    1. 说明 在调用 exec_()方法时,应用会进入主循环,而主循环会监听、处理事件 import sys from PyQt5.QtCore import Qt from PyQ…

    Linux 2023年6月7日
    088
  • Seata-初体验以及避坑

    Seata是什么 这里引用官方解释 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 …

    Linux 2023年6月7日
    099
  • Keytool配置 Tomcat的HTTPS双向认证

    keytool 简介 Keytool 是一个 Java数据证书的管理工具, Keytool将密钥(key)和证书(certificates)存在一个称为 keystore的文件中。…

    Linux 2023年6月6日
    0130
  • 设计模式——中介者模式

    中介者模式定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Mediator抽象中介者角色 抽象中…

    Linux 2023年6月7日
    085
  • redis高可用

    Redis-高可用(主从复制、哨兵模式、集群) 1.主从复制 1.1 主从复制简介 在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 从服务器(下文称…

    Linux 2023年6月13日
    089
  • zabbix

    1. zabbix介绍 2. zabbix特点 3. zabbix配置文件 4. 部署zabbix zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监…

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