问题:通过su命令切换用户并没有进入该用户的shell环境。这是为什么?
 
   要解决这个问题,我们必须清楚用login shell 和non-login shell的区别。
 
  • login shell:去的bash时需要完整的登录流程。就是说通过输入账号和密码登录系统,此时取得的shell称为login shell
  • non-login shell:取得sbash接口的方法不需要重复登录的举动。如以X Window登录登录linux后,再以X的图形界面启动终端机,此时那个终端机并没有需要输入账号和密码,那个bash环境就是non-login shell。在原本的bash环境下再次执行bash命令,同样也没有输入账号密码就进入新的bash环境(前一个bash的子进程),新的bash也是non-login shell。

那么,到底两者的区别在哪里?

login shell:此种方式登录时,shell会重新读取/etc/profile和~/.bash_profile来应用新的环境变量。
   non-login shell:此时shell不会读取/etc/profile和~/.bash_profile,而是读取~/.bashrc来应用新的环境变量。话说标题是区别与影响,影响的东西自然源于区别。回到文章开头的问题,su切换用户没有获取用户的环境(当时用的命令是"su xxoo",这里xxoo为要切换的用户,以root身份执行的此命令),看来问题就在这倆login方式,根据现象我们可以判断 su xxoo执行了non-login shell。

为了验证上面的判断,我们查看了su命令的简单帮助:

[root@isayme ~]# su --help
 Usage: su [OPTION]... [-] [USER [ARG]...]
 Change the effective user id and group id to that of USER.
 
   -, -l, --login               make the shell a login shell

很明显,我的判断是正确的,默认情况下是执行的non-login shell,因为要执行login shell需要在su后面添加参数"-"或"-l"或"--login"。所以要在su之后获取用户的环境变量,需要执行类似"su - xxoo"之类的命令。

  另外还有三个提示:

PS1:bash在读取/etc/profile后会读取各账户的个人配置文件,所读取的个人配置文件主要有三个:~/.bash_profile,~/.bash_login,~/.profile。其实bash在读取的时候只会读取的上述三个文件的其中一个,而读取的顺序则就是上面的顺序。也就是说bash会依次查找上述三个个人配置文件,且找到一个后,后续的文件便不再读取。

PS2:当以non-login shell登录时,如果希望获取用户的环境变量,执行"source ~/.bash_profile"即可(.bash_profile根据情况也可能是.bash_login或.profile),而其中source可以用小数点替换,即"source ~/.bash_profile"等价于". ~/.bash_profile"。source命令的解释可以自行搜索。

PS3:其实有的linux发行版的login shell也会读取.bashrc文件,如Fedora11中执行 "vim ~/.bash_profile"会发现 "if [ -f ~/.bashrc ]; then . ~/.bashrc fi"。这里就使用了PS2的提到的用小数点替换source特性,即在./bash_profile会读取执行.bashrc文件。

转自:http://blog.sina.com.cn/s/blog_59c0a56201016im6.html

login shell 和 non-login shell 的相关问题的更多相关文章

  1. linux shell except tcl login ssh Automatic interaction

    /*************************************************************************************** * linux she ...

  2. [ SHELL编程 ] 编程常用的ORACLE相关命令

    本文主要描述shell编程中常用的Oracle相关命令. 1.sqlplus -L/-S参数 sqlplus -L user/password #-L参数表示用户只尝试登录一次, 而不是在出错时再次提 ...

  3. Linux shell中的I/O重定向相关(转)

    1. 基本概念(这是理解后面的知识的前提,请务必理解)  a. I/O重定向通常与 FD有关,shell的FD通常为10个,即 0-9: b. 常用FD有3个,为0(stdin,标准输入).1(std ...

  4. shell 编程 && bash 简介(shell 变量、shell操作环境、数据流重导向、管线命令、shell script)

    如何学习一门编程语言 数据类型 运算符 关键字 1 认识BASH 这个shell linux是操作系统核心,用户通过shell与核心进行沟通,达到我们想要的目的.硬件.核心.用户之间的关系: 原理:所 ...

  5. 交互式shell和非交互式shell、登录shell和非登录shell的区别

    交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(intera ...

  6. Shell学习——Shell分类:登录shell和非登陆shell 交互shell和非交互shell

    1.从两个不同维度来划分,是否交互式,是否登录 2.交互式shell和非交互式shell 交互式模式:在终端上执行,shell等待你的输入,并且立即执行你提交的命令.这种模式被称作交互式是因为shel ...

  7. linux中的shell脚本编程---初识shell

    Shell是用户与Linux或Unix内核通信的工具,shell编程指的并不是编写这个工具,而是指利用现有的shell工具进行编程,写出来的程序是轻量级的脚本,我们叫做shell脚本. Shell的语 ...

  8. Shell编程-11-子Shell和Shell嵌套

    目录 什么是子Shell 子Shell产生的途径 Shell脚本调用模式 什么是子Shell     子Shell的概念其实是贯穿整个Shell的,如果想要更好的理解和写Shell脚本则必须要了解子S ...

  9. shell脚本实现监控shell脚本的执行流程及变量的值

    这篇文章主要介绍了shell脚本实现监控shell脚本的执行流程及变量的值本文使用shell完成对执行过程中条件语句中的变量的变化的监控和整个程序的执行流程的观察功能,需要的朋友可以参考下 很多时候, ...

  10. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用

    一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境       2> 练习命令历史.命令别名       3 ...

随机推荐

  1. Kubernetes项目简介

    Kubernetes项目简介 Kubernetes 是 Google 团队发起的开源项目,它的目标是管理跨多个主机的容器,提供基本的部署,维护以及运用伸缩,主要实现语言为 Go 语言.Kubernet ...

  2. 关于char是否能表示一个中文

    char是可以表示中文的 这个问题点有3个考核点 1 char是多少位的 2 java用的是什么方式表示字符 3 Unicode是用多少位表示的 1的答案是16位的,2的答案是Unicode,3的答案 ...

  3. python之random 、os 、sys 模块

    一.random模块 import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3 ...

  4. IDEA:配置Tomcat并运行应用

    1.File->ProjectStructre->Artifacts 如下界面 3.下一步:如图所示 4.选择相应的Module就行 5.第一次运行程序时最好选择运行的配置,否则可能运行的 ...

  5. Linux常用命令 | grep

      作者简介 李先生(Lemon),高级运维工程师(自称),SRE专家(目标),梦想在35岁买一辆保时捷.喜欢钻研底层技术,认为底层基础才是王道.一切新技术都离不开操作系统(CPU.内存.磁盘).网络 ...

  6. 关于es6 let var const 以及Symbol的总结

    ```javascript //es6新增块级作用域.声明变量用关键字let const , // es5中只有函数作用域和全局作用域,声明变量用关键字var  // let 和const 声明的变量 ...

  7. JVM 源码分析(二):搭建 JDK 8 源码调试环境(Windows 上使用 CLion)

    前言 一.准备源码 二.安装 "Bootstrap JDK" 三.配置编译环境 四.编译与测试 五.安装 CMake 和 GDB 五.准备远程调试 六.开始远程调试 前言 上一篇文 ...

  8. 【剑指 Offer】03.1.不修改数组找出重复的数字

    找出数组中重复的数字. 在一个长度为 n + 1 的数组 nums 里的所有数字都在 1-n 的范围内.所以数组中至少有一个是重复的.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, ...

  9. Android事件分发机制一:事件是如何到达activity的?

    事件分发,真的一定从Activity开始吗? 前言 很高兴遇见你~ 事件分发,android中一个老生常谈的话题了.基本的流程我们也都知道是从Activity开始分发,但有一个关键问题是:事件是如何到 ...

  10. linux之平均负载(学习笔记非原创)

    什么是平均负载 [root@111 ~]# uptime 11:03:33 up 149 days, 17:34, 1 user, load average: 0.08, 0.05, 0.01 最后三 ...