当前位置: 首页 > article >正文

Linux:login shell和non-login shell以及其配置文件

相关阅读

Linuxicon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482 


        shell是Linux与外界交互的程序,登录shell有两种方式,login shell与non-login shell,它们的区别是读取的配置文件不同,本文将以Bash shell为例就此进行阐述,但这个概念适用于其他shell,如ch、csh、tcsh、zsh。

login shell

        下面的这些情况下,登录的是login shell。

        1、通过GNOME等GUI界面输入用户名、密码后登录时(它不是命令行shell,但仍可看做是login shell)。

        2、root用户通过GNOME等GUI界面,设置了Run command as login shell选项,右击选择Open Terminal登录bash shell时。

        3、利用Ctrl+Alt+F*启动的终端输入用户名、密码登录bash shell时(包括ssh远程连接)。

        4、在shell中使用su命令,且使用-、-l、或--login选项时,详见Linux:用户切换指令su。

        5、在shell中使用bash命令,且使用-、-l、或--login选项时(无论是以交互式还是非交互式)。

non-login shell

        下面的这些情况下,登录的是non-login shell。

        1、通过GNOME等GUI界面右击选择Open Terminal登录bash shell时(不能设置Run command as login shell选项)。

        2、在shell中使用su命令,且不使用-、-l、或--login选项时,详见Linux:用户切换指令su。

        3、在shell中使用bash命令,且不使用-、-l、或--login选项时(无论是以交互式还是非交互式)。 

检验方法

        检验一个shell是否为login shell的方法有很多:

        1、可以检查$0特殊变量的值,如果其为-bash、-su的则代表其为login shell,如果其为bash、/bin/bash的则代表其为non-login shell,但这对于“通过GNOME等GUI界面输入用户名、密码后登录”和“在shell中使用bash命令”两种情况是失效的。

        2、使用下面的命令检查,如选项开启则表示为login shell,但这对于第1种情况是失效的。

shopt -q login_shell && echo "This is a login shell" || echo "This is a non-login shell"

        3、测试shell是否读取了配置文件/etc/profile(后面详细说明)。

        4、有些login shell在登录时会提示上次登录状态和时间。

配置文件

        首先说明,下面这些配置文件的读取和执行,是通过类似点命令source的效果自动完成的(但没有显式执行),关于该命令,见Linux:点命令source。

/etc/profile

  • 用途:/etc/profile是一个系统范围的login shell配置文件,即它会影响所有用户的shell环境设置。它用于定义系统范围的环境变量、启动程序和其他全局配置。

  • 执行时机/etc/profile会在login shell登录时执行,因此可以将一些测试语句加入其中/etc/profile用于检验一个shell是否为login shell(需要root权限),如下所示。

echo "This is from /etc/profile" >> /tmp/profile_test.log
  • 位置/etc/profile存在于系统的/etc目录中,这是一个全局文件,管理员可以在这里做一些对所有用户都有影响的配置。

  • 内容/etc/profile通常会包含对用户$PATH环境变量、历史记录设置、默认权限掩码(umask)等的定义。它还会执行/etc/profile.d目录下的其他脚本。

~/.bash_profile

  • 用途:~/.bash_profile是一个用户级别的login shell配置文件,它允许用户设置自己专属的环境变量、别名等。通常用于定义环境变量和其他只在登录时需要设置的内容。

  • 执行时机:~/.bash_profile会在Bash login shell登录时执行。

  • 内容:~/.bash_profile中经常包括对~/.bashrc的调用(通过source命令),这样Bash login shell不仅会执行login shell相关的配置,还可以执行non-login shell的配置。

~/.bash_login

  • 用途:~/.bash_login是另一个用户级别的login shell配置文件,与~/.bash_profile类似。Bash 在启动login shell时会先查找并执行~/.bash_profile,如果这个文件不存在,才会尝试执行 ~/.bash_login。

  • 执行时机:与~/.bash_profile类似,只在Bash login shell登录时执行。

  • 优先级:~/.bash_login通常较少使用,因为大多数用户更常用~/.bash_profile。只有当 ~/.bash_profile不存在时,Bash 才会尝试执行~/.bash_login。

  • 内容:内容上可以与~/.bash_profile类似,不过由于其优先级较低,它很少使用。

~/.profile

  • 用途:~/.profile是一个通用的login shell配置文件,它不只限于Bash shell,也会被其他shell(如sh)执行。这个文件用于设置用户的环境变量、启动应用等,并可以适用于任何Bourne shell派生的shell。

  • 执行时机:如果~/.bash_profile和~/.bash_login都不存在,Bash shell会执行~/.profile。因此,虽然它不是特定于Bash shell的配置文件,但仍然会在login shell中执行。

  • 内容:通常在~/.profile中设置用户环境变量和启动脚本。

~/.bashrc

  • 用途:~/.bashrc是一个用户级别的non-login shell配置文件。这个文件通常用于设置用户的别名、函数、命令提示符(PS1)和其他命令行的设置。它会在每次启动交互式non-login shell时被执行(例如打开终端模拟器)。

  • 执行时机:当Bash以non-login shell启动时(例如在图形界面中打开一个新的终端,或执行一个Bash脚本),会执行~/.bashrc。如果你希望login shell也执行其中的内容,如果在(通常如此) ~/.bash_profile或~/.profile中显式调用它(通过source命令,这会导致启动非交互式non-login shell时也执行~/.bashrc)。

  • 内容:~/.bashrc包含用户的别名、自定义函数、历史记录设置、命令提示符格式(PS1)等。它是交互式shell的主要配置文件。


http://www.kler.cn/news/314243.html

相关文章:

  • MQ入门(4)
  • kubernetes基础命令
  • 论文阅读--Planning-oriented Autonomous Driving(一)
  • “华为杯”第十二届中国研究生数学建模竞赛-D题:面向节能的单/多列车优化决策问题研究(续)(附MATLAB代码实现)
  • IPsec-VPN中文解释
  • 数据结构:二叉树(一)
  • 【计算机网络】详解UDP套接字网络字节序IP地址端口号
  • 2025年最新大数据毕业设计选题-Hadoop综合项目
  • TCP客户端编码和解码处理:发送和接收指定编码消息
  • 深度学习——基础知识
  • 初识zookeeper
  • 计组(蒋)期末速成笔记1
  • 基于MATLAB的运动模糊图像处理
  • LVGL学习
  • ES6 -- 2015
  • 肺结节检测系统源码分享
  • CLion/Git版本控制
  • 使用Rust直接编译单个的Solidity合约
  • VCG 顶点区域生长
  • 成都睿明智科技有限公司电商服务引领品牌跃升
  • 群晖NAS使用Docker本地部署网页版Ubuntu系统并实现无公网IP远程访问
  • 人工智能之就业方向(The Employment Direction of Artificial Intelligence)
  • Python套接字
  • 淘宝扭蛋机小程序,扭蛋机文化下的新体验
  • Flutter 踩坑记录分享(持续更新)
  • mockito+junit搞定单元测试(2h)
  • 前端JavaScript导出excel,并用excel分析数据,使用SheetJS导出excel
  • C++ 笔试常用算法模板
  • 在 Qt 中使用 QLabel 设置 GIF 动态背景
  • 【后端开发】JavaEE初阶—线程的理解和编程实现