Shell是什么
Shell是个程序,他会在用户登录系统后系统开启的,他可以通过标准输入来接收命令,然后执行命令,Shell可以执行内部命令和外部命令,内部命令就是Shell程序里面自己的逻辑,外部命令是Shell调用其他程序。
操作系统的核心是被保护的,我们只能通过Shell将我们输入的指令与核心沟通,让核心控制硬件来完成工作。
shell内部逻辑简介
其实shell就是由编程语言实现的程序,有不同组织实现的shell,
Shell的实现有哪些
- zsh
很多人的 mac 中会使用 zsh 而不是 bash,一大半是因为 oh-my-zsh 这个配置集,它兼容 bash,还有自动补全等好用的功能。 - sh
sh的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 shell。
csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。 - tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。 - ash
ash一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。 - bash
bash由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。bash 兼容 sh 意味着,针对 sh 编写的 shell 代码可以不加修改地在 bash 中运行。尽管如此,bash 和 sh 还是有一些不同之处:一方面,bash 扩展了一些命令和参数;另一方面,bash 并不完全和 sh 兼容,它们有些行为并不一致,但在大多数企业运维的情况下区别不大,特殊场景可以使用 bash 代替 sh。
如何看自己的Linux上安装了哪些Shell
可以通过查看/etc/shells
文件来看自己的Linux上有哪些可用的Shell
[root@VM-16-13-centos ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
如何查看当前用户配置的Shell
当我们登录的时候,系统就会给我们一个shell让我们来工作。Linux上有这么多shell那到底用的是哪个呢?
这个登录取得的shell就记录在/etc/passwd
文件中,文件中每一行的最后就是登录后的默认shell
[root@VM-16-13-centos ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
Shell启动时干了什么
你是否会觉得奇怪,怎么我们什么动作都没有进行,但是一进入 bash 就取得一堆有用的变量了? 这是因为系统有一些环境设置文件的 存在,让 bash 在启动时直接读取这些配置文件,以规划好 bash 的操作 环境啦! 而这些配置文件又可以分为全体系统的配置文件以及使用者 个人偏好配置文件。要注意的是, 我们前几个小节谈到的命令别名 啦、自订的变量啦,在你登出 bash 后就会失效,所以你想要保留你的 设置, 就得要将这些设置写入配置文件才行
Shell的配置文件
一般的shell都有两种配置文件,一者是全局的,放在/etc里,文件名前面没有’.'(非隐藏),另一种是放在用户家目录,只对当前用户生效,是隐藏的。
login shell与non-login shell在启动shell时读取的配置文件不同
- login shell:取得 bash 时需要完整的登陆流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登陆,需要输入使用者的帐号 与密码,此时取得的 bash 就称为“ login shell ”啰;
- non-login shell:取得 bash 接口的方法不需要重复登陆的举动,举 例来说,(1)你以 X window 登陆 Linux 后, 再以 X 的图形化接 口启动终端机,此时那个终端接口并没有需要再次的输入帐号与密 码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入帐号密 码, 那第二个 bash (子程序) 也是 non-login shell 。
注意不同的shell实现,系统级配置及用户级配置的文件的名字可能不一样
login shell读取:
- 系统级配置bash(
/etc/profile
):这是系统整体的设置,你最好不要修改这个文件; - 用户级配置:bash(
~/.bash_profile
或~/.bash_login
或~/.profile
):属于使用者个人设置,你要改自己的数据,就写入这里。
实线的的方向是主线流程,虚线的方向则是被调用的配置文件(即配置文件中调用了其他配置文件)! 从上面我们也可以清楚的知道,在 CentOS 的 login shell 环境下,最终 被读取的配置文件是“ ~/.bashrc ”这个文件喔!所以,你当然可以将自己 的偏好设置写入该文件即可。
non-login shell读取:
- 仅会读取bash(
~/.bashrc
) 而已啦
注意,所有的配置文件中可能还会读取其他配置文件
source :读入环境配置文件的指令
由于 /etc/profile 与 ~/.bash_profile 都是在取得 login shell 的时候才 会读取的配置文件,所以, 如果你将自己的偏好设置写入上述的文件 后,通常都是得登出再登陆后,该设置才会生效。那么,能不能直接读 取配置文件而不登出登陆呢? 可以的!那就得要利用 source 这个指令 了!
利用 source 或小数点 (.) 都可以将配置文件的内容读进来目前 的 shell 环境中! 举例来说,我修改了 ~/.bashrc ,那么不需要登出,立 即以 source ~/.bashrc 就可以将刚刚最新设置的内容读进来目前的环境 中!很不错吧!还有,包括 ~/bash_profile 以及 /etc/profile 的设置中, 很多时候也都是利用到这个 source (或小数点) 的功能喔!
环境变量、别名
如何查看环境变量
如何设置环境变量
如何使用环境变量
如何设置别名
如何查看别名
如何使用别名
环境变量与别名的区别
不同的shell间共享环境变量和别名吗?
在Shell里输入的命令是如何执行的
内部命令、外部命令
shell script
参考资料
- 鸟哥的Linux私房菜基础学习篇
- https://www.jianshu.com/p/a891af6f87e0
- https://www.cnblogs.com/victl/p/4498136.html