登录shell与非登录shell、交互式与非交互式shell的知识点详细总结

一、登录shell与非登录shell

1.登录shell定义:指的是当用户登录系统时所取的那个shell,登录shell属于交互式shell。

登陆shell通常指的是:用户通过输入用户名/密码(或证书认证)后启动的shell.例如:

当时候图形环境登录时启动X的看不见的shell、使用su-username、su -l username、通过bash --login、bash -l命令启动bash、通过网络登录一台远程机器上时登录的shell、虚拟控制台登录shell等。

而其他情况启动的shell基本上就都是“非登陆shell”了。

例如,从图形界面启动终端(在Gnome或KDE中打开一个“终端”(terminal)窗口程序)、使用su切换用户、通过bash命令启动bash在命令行替换中的子shell、被圆括号分组的命令使用的子shell、执行脚本时使用的shell等。

(一)登录与非登录shell的特点:

1.登录shell特点:

(1)登录shell属于交互式shell。用exit和logout皆可以退出。

2.非登录shell的特点:

例如:只能用exit退出,不能用logout退出。

注:用这个特证绝对可以区别登录和非登录shell。

(二)登陆与非登录shell的启动文件及其顺序(针对自己使用的rhel8)

1.登录shell启动文件顺序:

/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc。

2.非登录shell启动文件顺序(读取配置文件顺序):

~/.bashrc ->/etc/bashrc

(三)登录shell与非登录shell的区别

1.含义:登录shell,指的是当用户登录系统时所取的那个shell,登录shell属于交互式shell。

登录shell将查找5个不同的启动文件来处理其中的命令,用户登录后,在终端上输入命令,shell立即执行用户提交的命令,当用户退出后,shell也终止了。

2.完整度不同:如果启动了一个bash shell而没有登入系统(如在CLI提示符中键入bash),则启动了一个交互式非登录shell。交互式非登录shell执行~/.bashrc文件中的命令。

3.使用情况不同:登录shell的初始化文件(比如.bash_profile)通常会运行这个文件。这样,登录shell和非登录shell都可以使用.bashrc中的命令。

4.登陆方式不同:登录 shell 需要用户名、密码登录后进入的shell,或者通过 --login 选项生成的 shell 。

非登录 shell 是指不需要输入用户名和密码即可打开的 shell,比如输入命令 bash或者sh 就能进入一个全新的非登录shell,在Gnome或KDE中打开一个 “terminal” 窗口,也是一个非登录 shell。

5.参数值不同:

查看$0的值,登录shell返回--bash,而非登录shell返回的是bash(bash --login或者bash -l进入的登录shell除外)。

注:shell --login 或者shell -l直接进入登录shell,但是echo $0的结果是bash。

需要注意的是:执行exit命令,退出的shell可以是登录或者非登录shell;执行logout命令,则只能退出登录shell,不能退出非登录shell。

注:

1.如果通过bash --login命令进入登录shell,尽管进入的登录shell,$0的值是bash,而不是-bash。

2.非登录模式表示用户在新的shell中没有登录,能执行logout的shell,一定是登录模式中。

3.`su - `相关的所有shell方式都无法继承父shell环境变量.`ssh 用户名@ip script.sh`无法继承父shell环境变量.

4.在最开始,一般情况下,用户要么通过ssh登录要么直接在本地登录,这种属于是登录式shell。

   随后,在命令行下执行`su - 用户名`、`su -l username`、`bash -l`都是打开登录一个新的shell。而执行 `su 用户名`、`bash`都是打开一个新的shell,自动执行的shell脚本(没人人为输入的),但是没有登录。其中在图形界面打开命令界面也是非登录模式。

注:本条中bash的名字可以换成其他的shell的名字也可以,比如tcsh -l进入的shell是一个登录shell。

5.环境变量继承:

非登录模式会继承父shell的环境变量,而登录模式中`su - username`新打开的shell和父shell没有继承关系,所以不可以继承环境变量,但是`bash -l`可以继承父shell的环境变量。交互非登录式shell(比如`su username`命令登录的shell)继承父shell的环境变量。(注:bash -l等同于bash --login)

6.非登录shell不会执行/etc/profile,如果想获得里面的环境变量,必须执行source /etc/profile,即手动获取。

7.~/.bashrc文件中有这样一句:if [-f /etc/bashrc ]; then ./etc/bashrc fi,意思是判断/etc/bashrc文件是否存在,如果存在,则执行这个文件。所以有的书中说,~/.bashrc会运行/etc/bashrc文件。

8.登录shell和非登录shell具体会读取什么配置文件,要根据具体的系统版本而定,如RHEL6.3中非登录shell仅执行了“~/.bashrc”文件(没有执行/etc/bashrc),而Ubuntu10.04中却依次执行了/etc/bash.bashrc和~/.bashrc 文件。rhel8非登录shell则执行了~/.bashrc和/etc/bashrc两个配置文件。对于这些规则,可以直接在相应的配置文件中加一些echo命令来验证其真实性。

9.识别登录shell和非登录shell,仅在当前shell中查看 $0 的值是不可以的,因为通过bash --login(或者bash -l)命令进入的是登录shell,$0的值是bash(尽管是个登录shell)。但是登录shell一共就2种情况,情况1是$0的值为-bash一定是登录shell,情况2是通过bash --login(或者bash -l)登录到的shell一定是登录shell。

10.使用将环境放在/etc/profile.d/*.sh的脚本中,更加的方便快捷一点,这个准则是不一定的,不是所有的系统的非登录shell都会读取这些文件,比如rhel8就是如此。这个准则成立的前提是所有交互式shell都会运行/etc/profile.d/*.sh才可以。

二、交互式shell与非交互式shell

1.交互式shell:shell与用户存在交互;非交互式:即shell与用户不存在交互。非交互式,是shell的另一种运行模式,它专门被用来执行预先设定的命令。在这种模式下,shell不与用户进行交互,而是读取存放在脚本文件中的命令并执行它们。当它读到文件的结尾,这个shell就终止了。
比如,Non Interactive Shell:你需要写一个bash script,用外部shell执行“bash script.sh”命令,它(bash)从可以第一条命令执行到最后一条然后退出,不与你进行任何交互,它就是非交互式shell。

交互式非登录shell,例如你在Gnome图形界面中打开“终端”出来的那种窗口程序,和登录shell相比,它是“非登录”的,你并不需要输入用户名和密码,和非交互式shell相比,这是“交互式”的,就像你说的那它“你输入什么,它就解释什么”。

注:

1.交互、非交互模式的本质区别在于,一批任务在执行过程中,是否需要人机互动。比如执行一批任务,需要手动一个一个敲入命令,这样就是交互模式,还有在命令执行过程中,需要人为为程序输入数据,这也是交互模式,不过如果提前准备好输入,例如:`order <input.txt`不需要人为输入数据,也就变成了非交互模式。将一批任务写为一个shell脚本,虽然过程中不需要人为再输入命令,但是可能程序执行过程中需要输入参数,所以执行shell脚本这即可能是交互模式,也可能是非交互模式。

2.交互式shell举例:

(1)交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令,然后将结果反馈给你。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。

3.非交互式shell举例:

(1)脚本执行shell(不需要人为输入的)。

4.交互式shell与非交互式shell区别:读取的配置文件不同,交互式bash必然读取~/.bashrc文件;非交互式bash读取的是环境变量BASH_ENV(通常情况下)所指定的配置文件。

5.交互式shell会启动如下文件:(1)~/.bashrc(2)/etc/bashrc(~/.bashrc文件会启动/etc/bashrc)

6.交互式shell指打开了一个shell进入了一个新的命令行界面。所有的交互式shell一般都会执行~/.bashrc文件和/etc/bashrc两个文件(e.g.rhel8系统)。

7.为了更直观,给大家配置2个表格

                                        表6-13 不同类型的bash Shell

上下文

登录Shell

交互式Shell

从虚拟控制台登录Shell

通过网络Shell到一台远程机器上时登录Shell

X初始化Shell

X终端Shell

手动运行bash启动的子Shell

用在命令替换中的子Shell

被圆括号分组的命令使用的子Shell

执行脚本时使用的子Shell

                                                表 6-14 bash的启动配置文件

Shell类型

预期功能

/etc/profile

登录Shell

通用的有效环境变量

/etc/profile.d/*.sh

登录Shell

软件包特有的环境变量

~/.bash_profile

登录Shell

用户特有的环境变量

~/.bashrc

所有交互式Shell

用户特有的别名、Shell功能和Shell选项

/etc/bashrc

所有交互式Shell

通用别名、Shell功能和Shell选项

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【docker笔记】docker常用命令

1、帮助启动类命令 1.1 启动、重启、查询当前状态、停止 systemctl start docker systemctl stop docker systemctl restart docker systemctl status docker1.2 设置开机启动 systemctl enable docker1.3 查看docker概要信息 docker info1.4 查看docker帮助文档 docker -…

python的故事

当Python这门编程语言诞生于上世纪90年代末的时候&#xff0c;很少有人能够预见到它将成为如今广受欢迎的一门语言。然而&#xff0c;正是由于其简洁、易读、强大的特性&#xff0c;以及活跃的开发社区&#xff0c;Python逐渐崭露头角&#xff0c;取得了长足的发展。 故事的开…

spring-validation实现分组校验

文章目录 前言实际开发可能会使用到分组校验maven添加依赖简单使用高级应用分组自定义分组组合分组 源码地址 前言 JSR 303中提出了Bean Validation&#xff0c;表示JavaBean的校验&#xff0c;Hibernate Validation是其具体实现&#xff0c;并对其进行了一些扩展&#xff0c;…

GO语言基础笔记(一):基本语法与数据类型

基本语法 变量声明&#xff1a; 使用 var 关键字&#xff0c;如 var x int 声明一个整型变量 x。简短声明方式&#xff0c;如 y : 0 直接初始化 y。 函数定义&#xff1a; 使用 func 关键字定义函数&#xff0c;如 func add(a int, b int) int { return a b }。 控制结构&…

Arduino上U8g2库显示中文的经历

u8g2自带很多中文库&#xff1b;但是向u8g2_font_wqy12_t_chinese3 比较全的应该是u8g2_font_wqy12_t_gb2312 这个&#xff0c;只是我还没有调用成功 这个库&#xff0c;中文就显示不全&#xff1b;有些没有定义&#xff0c;如百家姓 #include <Arduino.h> #include <…

Java经典框架之Spring

Java经典框架之Spring Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring简介 2.…

HA启动Advanced SSH Web Terminal 提示附加组件似乎尚未准备就绪,它可能仍在启动。是否要再试一次?

环境&#xff1a; Home Assistant OS11.1 Advanced SSH & Web Terminal 17.0 问题描述&#xff1a; HA安装好SSH加载项&#xff0c;启动Advanced SSH & Web Terminal 提示附加组件似乎尚未准备就绪&#xff0c;它可能仍在启动。是否要再试一次&#xff1f; 解决方案…

设计模式之-策略模式,快速掌握策略模式,通俗易懂的讲解策略模式以及它的使用场景

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式&#xff0c;5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;每一种模式的概念、使用…

.NET中的Swagger使用

目录 前言 一、Swagger是什么&#xff1f; 二、如何Swagger文档说明的信息 1.在AddSwaggerGen方法中写入文档信息 2.运行效果 二、文档UI界面标题、路由设置 1.在中间件UseSwaggerUI方法中配置 三、文档UI界面添加接口注释 1.在 .csproj中配置 2.在AddSwaggerGen方法中配置Incl…

Apache Spark简介与历史发展

在当今信息爆炸的时代&#xff0c;大数据处理已成为了现实。企业和组织需要处理海量数据来获得有用的信息和见解。Apache Spark作为一个开源的大数据处理框架&#xff0c;已经在大数据领域占据了重要地位。 Apache Spark简介 Apache Spark是一个用于大规模数据处理的快速、通…

【zookeeper特点】

文章目录 1. Zookeeper介绍2、ZooKeeper数据结构 1. Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分 布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性 …

java8 reduce操作

什么是 reduce 操作 reduce 操作是一种通用的归约操作&#xff0c;它可以从一个元素序列中生成一个单一的结果&#xff0c;通过反复将一个组合操作应用到序列中的元素上。例如&#xff0c;我们可以使用 reduce 操作来计算一个整数序列的和&#xff0c;或者将一个字符串序列拼接…

EventSource和WebSocket

eventSource&#xff08;事件源&#xff09;和WebSocket都是用于实现服务器与客户端之间的实时通信的技术&#xff0c;但它们在一些方面有所不同。 eventSource eventSource是HTML5中的一种技术&#xff0c;它允许服务器向客户端发送单向的、持久的、自动的消息。它基于HTTP协…

新版IDEA中Git的使用(一)

说明&#xff1a;本文介绍如何在新版IDEA中使用Git 创建项目 首先&#xff0c;在GitLab里面创建一个项目&#xff08;git_demo&#xff09;&#xff0c;克隆到桌面上。 然后在IDEA中创建一个项目&#xff0c;项目路径放在这个Git文件夹里面。 Git界面 当前分支&Commit …

GO语言基础笔记(五):包的介绍

在Go语言中&#xff0c;包&#xff08;package&#xff09;是代码组织和重用的基本单位。Go的标准库中包含了许多实用的包&#xff0c;它们提供了从基础数据处理到复杂网络编程等各种功能。下面是一些常用的Go标准库包及其作用的介绍&#xff1a; 目录 1. fmt 2. net/http …

Qt/QML编程学习之心得:在QML中调用fileDialog(十六)

Qt中有一些内置的对话框dialog,比如 在QWidget工程中使用比较容易,比如 #include <QFileDialog>fileName = QFileDialog::getOpenFileName(this, tr("Open Image"), "/home/jana", tr("Image Files (*.png *.jpg *.bmp)")); 那么在QM…

使用eclipse创建一个java文件并运行

启动 Eclipse 并创建一个新的 Java 项目: 打开 Eclipse。 选择 “File” > “New” > “Java Project”&#xff08;文件 > 新建 > Java 项目&#xff09;。 在弹出的窗口中&#xff0c;为你的项目命名&#xff0c;比如 MyJavaProject。 点击 “Finish”&#xff…

word2003 open word2007+

Win 7 C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates 还是不行&#xff0c;重装office2003吧&#xff0c;再安装转换插件&#xff0c;但是再高版本好像没转换工具

由正规表达式构造DFA,以及DFA的相关化简

目录 1.由正规式到DFA 首先讲如何从正规式到NFA 如何从NFA到DFA 2.DFA的化简 3.DFA和NFA的区别 1.由正规式到DFA 正规式--->NFA---->DFA 首先讲如何从正规式到NFA 转换规则: 例题1&#xff1a;这里圆圈里面的命名是随意的&#xff0c;只要能区别开就可以了 如何…

R语言中的函数28:Reduce(), Filter(), Find(), Map(), Negate(), Position()

文章目录 介绍Reduce()实例 Filter()实例 Find()实例 Map()实例 Negate()实例 Position()实例 介绍 R语言中的Reduce(), Filter(), Find(), Map(), Negate(), Position()是base包中的一些高级函数。随后&#xff0c;很多包也给这些函数提供了更多的扩展。 Reduce() 该函数根…