Linux(centos7)缺失.bashrc文件登录出现bash-4.2

news2024/12/29 8:45:11

一、问题描述

最近遇到几次登陆linux(centos7.5)系统后,虽然在/root用户下,但出现了如下界面:

在这里插入图片描述

二、解决思路

使用不同的linux发行版本,(比如:IP为*...90,以下简称90)会出现此种现象,而且其他目录使用正常,软件使用正常。我详细对比了90 /root目录下所有的文件(包括隐藏文件)、甚至还查看了/etc/profile,发现90 /root目录确实缺少了某些隐藏文件,比如.bashrc、.bash_logout、.ssh,那么我如何就能确定问题可能就出现在这三个文件中呢,因为我怀疑是环境变量的问题(怀疑的依据来自shell高级编程中环境变量的相关知识《linux命令行与shell脚本编程大全》第六章),因此我还将隐藏文件里面的信息逐个看了一遍,最终锁定在.bashrc、.bash_logout、.ssh这四个中。
在这里插入图片描述

.ssh

安装操作系统后,.ssh一般不会存在,当您需要进行免密认证,比如现在常用的ansible进行批量操作主机是,就需要使用到,所以这个隐藏文件目录及其下文件被优先排除掉,因为他不会影响登陆显示。

.bash_logout

logout的排除多少和这个文件本身有直接的关系,不信我贴这个文件的中的代码,您一样得排除掉他,不信看下图!

在这里插入图片描述

.bashrc

这个文件其实,我真没在在意,个人觉得除了配置一些常用命令别名外,您能从这个文件中看出什么呢?文件代码如下:

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

通过以上得代码不难看出,.bashrc文件会去执行/etc/bashrc文件,那么/etc/bashrc文件是否会直接导致系统进入-bash-4.2#呢?于是我认真的看完了/etc/bashrc代码行,并逐行分析,出现bash-4.2的原因终于锁定在以下代码行!

# are we an interactive shell?
if [ "$PS1" ]; then
  if [ -z "$PROMPT_COMMAND" ]; then
    case $TERM in
    xterm*|vte*)
      if [ -e /etc/sysconfig/bash-prompt-xterm ]; then
          PROMPT_COMMAND=/etc/sysconfig/bash-prompt-xterm
      elif [ "${VTE_VERSION:-0}" -ge 3405 ]; then
          PROMPT_COMMAND="__vte_prompt_command"
      else
          PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
      fi
      ;;
    screen*)
      if [ -e /etc/sysconfig/bash-prompt-screen ]; then
          PROMPT_COMMAND=/etc/sysconfig/bash-prompt-screen
      else
          PROMPT_COMMAND='printf "\033k%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
      fi
      ;;
    *)
      [ -e /etc/sysconfig/bash-prompt-default ] && PROMPT_COMMAND=/etc/sysconfig/bash-prompt-default
      ;;
    esac
  fi
  # Turn on parallel history
  shopt -s histappend
  history -a
  # Turn on checkwinsize
  shopt -s checkwinsize
  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

从以上的代码行,不难看出,有很多奇怪的变量,那么这些变量到底是干啥的?

$PS1

PS1命令是linux系统中的一个全局变量,用于定义用户命令行的字符显示。
在这里插入图片描述
格式为:用户@主机名 当前目录
PS1默认值对应命令行样式为:
在这里插入图片描述
注:更详细的PS1用法这里不再阐述

$PROMPT_COMMAND

在bash里设置环境变量PROMPT_COMMAND,这个命令会在用户提示符之前被执行(这个我个人理解为一个预执行语句)。

$TERM

xterm等是终端, T E R M ,当前系统 TERM,当前系统 TERM,当前系统TERM取值是 xterm。

三、分析结果

通过对/etc/bashrc代码分析,判断出影响定位到了哪一个变量会导致出现bash-4.2,他就是 P S 1 ,最大的罪魁祸首是他,是他,就是他,让我分析了 2.5 小时。如果没有 . b a s h r c 文件,就会导致无法执行 / e t c / b a s h r c , 因此 PS1,最大的罪魁祸首是他,是他,就是他,让我分析了2.5小时。如果没有.bashrc文件,就会导致无法执行/etc/bashrc,因此 PS1,最大的罪魁祸首是他,是他,就是他,让我分析了2.5小时。如果没有.bashrc文件,就会导致无法执行/etc/bashrc,因此PS1的就会出现下面的代码:

-bash-4.2# echo $PS1
\s-\v\$
-bash-4.2# 

代码块解读的意思就是:v 就代表bash版本号,但是没有问题到这里就终结了吗?并没有!详见第五步。

四、解决办法

1、重新从/etc/skel/复制一份.bashrc到用户家目录。
2、将以下代码块加入/etc/profile中,当然您还可以加入到shell默认读取另外几个文件中。

if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

五、追根溯源

我们得到了问题的解决方法,但未真正明白为什么没有bashrc文件就会出现bash-4.2呢?那就证明还有其他文件仍然在更改环境变量。到底是谁呢?通过/etc/profile文件中的代码块也许能明白什么·?

or i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

这些文件会被shell执行的,因此我们接下的定位工作就出现在以下的文件中了

在这里插入图片描述
通过文件的查看与对比,最终我锁定在bash_completion.sh这个文件了,这个文件我没有详细的去拆解了。这个文件包含的主要是以下内容:
1、检查查交互式bash并返回
2、检查bash的最新版本

# Check for interactive bash and that we haven't already been sourced.
[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION_COMPAT_DIR" ] && return

# Check for recent enough version of bash.
bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}
if [ $bmajor -gt 4 ] || [ $bmajor -eq 4 -a $bminor -ge 1 ]; then
    [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \
        . "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion"
    if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then
        # Source completion code.
        . /usr/share/bash-completion/bash_completion
    fi
fi
unset bash bmajor bminor

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

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

相关文章

课程19:个人中心功能与提示优化

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

Android中加载一张大图,如何正常显示且不发生OOM ?

问题 在Android中,获取一个1000*20000(宽1000px,高20000px)的大图,如何正常加载显示且不发生OOM呢? 分析 Android系统会为应用分配一定大小的堆内存 而如果遇到高分辨率图片时,如果它的配置为ARGB(每个像素占4Byte) 那么它要消…

深度学习(23)——YOLO系列(2)

深度学习(23)——YOLO系列(2) 文章目录 深度学习(23)——YOLO系列(2)1. model2. dataset3. utils4. test/detect5. detect全过程 今天先写YOLO v3的代码,后面再出v5&…

【PCB专题】案例:PCB板厂说焊盘宽度太小容易沉金不良,但加宽又可能导致阻焊桥在阻焊为黑色油墨下无法做出?

此案例是最近在Layout一块PCB板卡,使用了一个以前我没有接触过的器件,此器件的封装是QFN128。 总的问题是:PCB板厂说如果按原稿制作的话,焊盘宽度太小沉金容易不良,但电话里和我说如果加宽又可能导致阻焊桥在黑色油墨情况下无法做出? 板厂给的EQ如下所示,表示TOP面设计…

【Unity之IMGUI】—编译模式下控件可视化及其封装

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

【从零开始开发一个线上网课系统-01】账号登录及退出登录功能开发

文章目录 1 视图层开发2 form表单验证3 配置urls.py4 模板层开发 实际上在系统开发的博客中应该先描述数据库设计,但由于设计的表比较多,其理解简单,但撰写和描述较为麻烦,所以我以可视化方式来呈现这些数据表以及其中的关系&…

RISCV Reader笔记_1 RISCV的意义

RISCV Reader RISCV的诞生 出众之处 RISCV架构被设计的目的就是成为一个通用的指令集架构 ISA。不仅支持从微控制器到高性能计算机的各种处理器,兼容各种编程语言,还适应FPGA ASIC等所有实现技术,稳定…… 计算机体系结构为了在指令集更新…

Iceberg从入门到精通系列之一:Iceberg核心概念理解

Iceberg从入门到精通系列之一:Iceberg核心概念理解 一、Iceberg核心概念二、Iceberg表结构三、数据文件四、表快照Snapshot五、清单列表Manifest list六、表快照、数据文件和清单列表之间的关系七、Catalog八、Hive Catalog九、Hadoop Catalog十、Hive Catalog和Had…

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序 完整程序: clc; clear; close all; warning off; addpath(genpath(pwd)); %%%%%%%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N = 10^6; r_n = rand(1,N)>0.5; BPSK = 2*r_n-1; E_n_d…

chatgpt赋能python:Python生成GUI的步骤和工具

Python生成GUI的步骤和工具 Python是一种广泛使用的编程语言,其语法简洁、易学、可读性强等特点深受程序员喜爱。 Python的GUI编程让我们可以为用户提供友好的界面,帮助用户更好地理解和使用程序。Python生成GUI的过程并不复杂,本文将为您介…

代码随想录算法训练营第42天 | 01背包问题理论基础 + 416.分割等和子集

今日任务 目录 01背包问题 二维数组 01背包问题 一维/滚动数组 416.分割等和子集 - Medium 01背包问题 二维数组 理论基础:代码随想录 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品…

课程18:角色权限功能实现

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

chatgpt赋能python:Python生成C++代码-提高生产力的利器

Python 生成 C 代码 - 提高生产力的利器 Python 作为一种高级编程语言,在数据分析、机器学习等领域都有着广泛的应用。但是,Python 被认为速度慢,无法处理一些高性能的任务。此时,C这种低级语言就被用来替代 Python,以…

实战:构建工具-共享库配置实践-2023.6.22(测试成功)

实战:构建工具-共享库配置实践-2023.6.22(测试成功) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 gitlab/gitlab-ce:15.0.3-ce.0 jenkins/jenkins:2.346.3-2-lts-jdk11实验软件 链接:https://pan.baidu.com/…

Flutter Dart操作符

常见的操作符大家都知道就不多介绍了,主要来看看Java所没有的。 类型判定操作符 as、 is、 和 is! 操作符是在运行时判定对象 类型的操作符 操作符解释as类型转换is如果对象是指定的类型返回 Trueis!如果对象是指定的类型返回 False as 操作符把对象转换为特定的类…

如何加入开源社

开源社成立于 2014 年,是由志愿贡献于开源事业的个人成员,依 “贡献、共识、共治” 原则所组成,始终维持厂商中立、公益、非营利的特点,是最早以 “开源治理、国际接轨、社区发展、项目孵化” 为使命的开源社区联合体。开源社积极…

chatgpt赋能python:Python生成GUID:让你的代码变得更加唯一

Python生成GUID:让你的代码变得更加唯一 在现代软件开发领域中,一个核心的问题是如何确保代码生成的ID是唯一的。通过Python语言生成全球唯一标识符(GUID)是一个非常流行的方法,而且是非常容易实现的。 什么是Python…

FutureTask源码

介绍 在创建线程的方式中,我们可以直接继承Thread和实现Callable接口来创建线程,但是这两种创建线程的方式不能返回执行的结果。于是从JDK1.5开始提供了Callable接口和Future接口,这两种创建线程的方式可以在执行完任务之后返回执行结果。 …

Java8 LocalDateTime获取当前周是本年第几周weekOfYear,用WeekFields

Java8 LocalDateTime获取当前周是本年第几周weekOfYear, 可用WeekFields LocalDateTime 没有直接获得 weekOfYear 的方法 LocalDateTime 有一个 get(TemporalField field) 方法, 返回 int public int get(TemporalField field) {if (field instanceof ChronoField chronoFiel…

读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量

1. 停电事故后电力恢复的方式 1.1. 停电后常见的情形是,送电几秒钟后又再次断电 1.2. 数百万台空调和冰箱的用电需求,使刚刚恢复的电力供应发生过载 1.3. 当电力供应不足时,增加的电流很快就到达满负荷,导致过载,触…