执行脚本登录的子SHELL(课堂笔记引发的思考)

本周,老师讲解了shell的登录方式,有交互式登录与非交互登录,小编并没有理解,觉得笔记似乎有一些问题,也可能是自己想错了。通过查阅资料,以及做一些相关的实验,加上自己的理解,小编整理了一下……
shell程序是一个过程式的解释器,将源码程序翻译成机器语言,然后执行。shell脚本其实就是一系列命令组成的文本文件,这些命令组合起来完成一个或者一项功能。
登录shell之后,shell会自动加载一些配置文件(配置文件的作用可以参考附录1)/etc/profile,/etc/profile.d/*.sh ,~/.bash_profile,~/.bashrc,/etc/bashrc,登录方式的不同,加载的配置文件也不同。
上课的时候,老师按照登录的方式,讲shell分成了交互式登录(登录式shell)和非交互登录(非登录式shell)。
课堂笔记如下:

交互式登录(登录shell)  
    使用终端通过用户名密码登录
    su - username
    执行顺序:/etc/profile -->/etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互登录 (非登录shell)
    su username 
    图形界面下打开终端
    执行脚本
    其他bash实例    
    执行顺序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

可是,小编发现,执行脚本,似乎并不会执行这三个文件。《实验一》内容如下:
1、在三个文件中分别加入了一行命令。
(在~/.bashrc文件中加入一行“echo “文件:~/.bashrc””,
在/etc/bashrc文件中加入一行“echo “文件:/etc/bashrc””,
在/etc/profile.d/目录下创建一个文件,将其命名为“ceshi.sh”,并加入一行“echo “文件:/etc/profile.d/ceshi.sh””)
2、然后随便创建了一个脚本。脚本内容如下:“echo “你好!””,并添加“x执行”权限。
3、然后执行脚本,输出内容如下:
[root@CentOS7 bin]# chmod 777 test.sh
[root@CentOS7 bin]# /bin/bash test.sh
你好!
[root@CentOS7 bin]#
结果并未输出:
文件:~/.bashrc
文件:/etc/bashrc
文件:/etc/profile.d/ceshi.sh
基于这个问题,查阅了一些资料,网上说的零零散散的不太完整,小编整理了一下,依然是似懂非懂的。将自己的理解分享出来。
shell可以分成交互式与非交互式,登录式与非登录式,一共四类。
交互式就是shell等待你的输入, 并且立即执行你提交的命令。
非交互式就是shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
登录式就是通过输入帐号和密码登录。
非登录式就是并不需要输入用户名和密码便可以登录的方式。
小编通过统计,我知道的登录shell的方式有八种,然后为了知道他们登录shell后加载那些文件,小编联系到上面的实验,将《实验一》内容做了一些改动,《实验二》(
在/etc/profile文件中加入一行“echo “文件:/etc/profile””,
在/etc/profile.d/目录下创建一个文件,将其命名为“ceshi.sh”,并加入一行“echo “文件:/etc/profile.d/ceshi.sh””
在~/.bash_profile文件中加入一行“echo “文件:~/.bash_profile””,
在~/.bashrc文件中加入一行“echo “文件:~/.bashrc””,
在/etc/bashrc文件中加入一行“echo “文件:/etc/bashrc””,)每种登录方式的输出结果如下所示:
1、在控制台通过账户密码:

文件:/etc/profile
文件:/etc/profile.d/ceshi.sh
文件:~/.bash_profile
文件:~/.bashrc
文件:/etc/bashrc

结果证明,该方式打开的shell,读取了五个配置文件。
2、通过ssh终端:

文件:/etc/profile
文件:/etc/profile.d/ceshi.sh
文件:~/.bash_profile
文件:~/.bashrc
文件:/etc/bashrc

结果证明,该方式打开的shell,读取了五个配置文件。
3、命令行中su - username:

[root@CentOS7 ~]# su - root
Last login: Sun Aug 13 14:26:26 CST 2017 from 192.168.109.1 on pts/2
文件:/etc/profile
文件:/etc/profile.d/ceshi.sh
文件:~/.bash_profile
文件:~/.bashrc
文件:/etc/bashrc

结果证明,该方式打开的shell,读取了五个配置文件。
4、命令行中su username:

[root@CentOS7 ~]# su root
文件:~/.bashrc
文件:/etc/bashrc
文件:/etc/profile.d/ceshi.sh

结果证明,该方式打开的shell,读取了三个配置文件。
5、命令行执行bash:

[root@CentOS7 ~]# bash
文件:~/.bashrc
文件:/etc/bashrc
文件:/etc/profile.d/ceshi.sh

结果证明,该方式打开的shell,读取了三个配置文件。
6、图形界面右键Open terminal:

文件:~/.bashrc
文件:/etc/bashrc
文件:/etc/profile.d/ceshi.sh
[root@CentOS7 ~]# 

结果证明,该方式打开的shell,读取了三个配置文件。
7、通过“()”:通过平时的操作小编发现,通过“()”打开的子shell,可以继承父shell的本地变量。在《实验二》上增加内容,制作成《实验三》,内容如下:

[root@CentOS7 ~]# A=123
[root@CentOS7 ~]# export B=321
[root@CentOS7 ~]# echo $A $B
123 321
[root@CentOS7 ~]# (echo $A $B)
123 321
[root@CentOS7 ~]# 

该实验证明,通过“()”打开的子shell,五个配置文件并没有读。不过通过“()”打开的子shell不仅可以继承父shell的环境变量B,还可以继承本地变量A。
8、执行脚本:根据《实验一》得出结论:执行脚本,开启的shell,并不会加载配置文件。虽然测试出了结果,由于小编才疏学浅,并不知道具体原因出在哪里。

附录1:
【1】/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置。
【2】~/.bash_profile: 用来设置一些环境变量,功能和/etc/profile 类似,但是这个只对个别用户。
【3】~/.bashrc: 作用类似于/etc/bashrc, 只是针对用户自己而言。
【4】/etc/bashrc: 设置系统bash相关的东西(例如:可以在这个文件修改所有用户的别名),对系统内所有用户生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值