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

来源:互联网 发布:阿里云系统的手机 编辑:程序博客网 时间:2024/05/16 07:06

本周,老师讲解了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 - rootLast 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 $B123 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相关的东西(例如:可以在这个文件修改所有用户的别名),对系统内所有用户生效。