Shell的理解

笔记

Posted by Jingming on November 27, 2020

Shell理解

http://c.biancheng.net/view/706.html
https://www.cnblogs.com/33debug/p/6657519.html
http://c.biancheng.net/cpp/view/6995.html
https://blog.csdn.net/qq_41729871/article/details/103387864
https://blog.csdn.net/LEON1741/article/details/77931460

Shell是什么

Shell是程序员操作操作系统的入口。Shell是一种带图形的软件工具,让程序员输入命令来指导操作系统干活,然后获取返回结果。

Shell是如何连接用户和内核的呢?

答案是:上面提到的命令中有些最基本的是shell自己提供的。例如,Shell提供的ls命令可以让程序员方便的查看当前路径下所有文件名。

Shell提供的命令的实现原理是什么呢?

答案是:Shell命令调用了内核提供的函数接口。简单的ls命令的背后,是二进制的可执行代码,它的源码是某种语言(c语言)且一定调用了操作系统的接口,而这些接口里面就一定包括文件操作函数。

理解这两个问题后,我们知道,Shell可以提供各种命令(命令集合)。那么下面两条就好理解了:

  • 不止一种Shell,完全可以有另一个Shell提供另一种命令集;

  • Shell的命令之间的任意的一种”排列组合”(也就是Shell脚本)就是一个新的命令,而这种排列组合并不是简单的命令堆砌,是一种编程语言。也就是说Shell还兼职编译器、解释器一类的任务。

不仅如此,Shell还可以调用非自带的外部命令,也就是调用任何源码生成的可运行的二进制文件。原理就是Shell调用内核的fork方法创建新进程,用execv函数簇在新进程中运行用户指定的程序,最后shell用wait命令等待新进程结束。

Shell的种类

上面提到了Shell可以有多种,那么不同Shell有什么区别呢?我们知道,Shell其实可以看作是某种编译器或解释器,那么不同Shell之间的区别,可以使用一个类比:C++的Clang编译器和G++编译器的区别。

可以知道好用的Shell一定是:

  • 功能强大。

  • 性能好,例如占内存资源少,这样就几乎可以在任何硬件、操作系统环境种工作。

  • 交互友好的,例如可以提供命令补全。

如何理解操作系统中有多个Shell?

之前提到,Shell可以运行外部命令,而另一个Shell对于当前Shell来说,就是一种外部命令

运行脚本的时候,当前的Shell可以指定另一种Shell来运行这个脚本,该Shell运行完脚本之后,再把控制权交还给当前的Shell即可。

另一个Shell运行权限可能是限制的,且脚本中定义的变量都是相对于该Shell的局部变量(可以使用export命令让该变量对当前环境其他Shell可见)。

Linux自带的Shell是bash,现代的Linux上,sh已经被bash 代替,/bin/sh往往是指向/bin/bash的符号链接。

bash功能全面,因此脚本语言多指定bash shell来执行,以避免不兼容。

查看Shell信息

首先,使用cat /etc/shells 查看当前系统下所有可用shell。

其次,看当前使用的shell: https://www.cnblogs.com/softwaretesting/archive/2012/02/14/2350688.html

推荐使用:

echo $$ 查看当前shell的pid

ps 查看pid

最后,执行其他Shell,参考:https://blog.csdn.net/simple_the_best/article/details/76285429

例如,cd /bin && ./zsh 来进入zsh shell,然后在其中执行ls命令等。

切换bash:chsh -s /bin/bash

切换zsh:chsh -s /bin/zsh

PS.

  • 每个bash都有自己的rc(run command)配置文件,例如bash对应.bashrc文件,zsh对应.zshrc文件。 bash启动时候会先执行该文件配置。

  • Shell命令使用:https://github.com/skywind3000/awesome-cheatsheets/blob/master/languages/bash.sh

Shell的模式

这里的模式主要指:login shell 和 no-login shell;interactive shell 和 non-interactive shell。

login shell

login shell是指用户登陆后使用的shell,包括:

(1)登陆mac操作系统后,打开的终端里就是使用login shell;

(2)切换到root后的shell;

(3)ssh之后的shell。

login shell登陆后会自动去执行/etc/profile和~/.profile文件。ubuntu中默认的shell是bash(通过echo $SHELL查看),因此对应执行的profile文件就是~/.bash_profile。

login shell不会自动执行任何的bashrc文件,所以一般在 /etc/profile 或者 ~/.profile里配置 source bashrc 文件.

no-login shell

(1)登陆ubuntu操作系统后,默认情况下按快捷键打开的终端是no-login shell;

(2)终端中直接输入bash来启动的shell;

no-login shell不会执行任何profile文件。

https://www.linuxprobe.com/diff-bashrcprofile.html

interactive shell

有命令提示符让我们输入命令的那种Shell。

该模式下会存在一个PS1的环境变量,如果该shell不是login shell,那么就会去执行 /etc/bash.bashrc和~/.bashrc文件。

interactive shell且no login的典型:登陆ubuntu操作系统后,默认情况下按快捷键打开的终端。

non-interactive shell

通过bash -c “CMD” 来执行的bash属于non-interactive shell。该模式下不会执行bashrc文件。

rc 和 profile 的区别

profile是属于用户的配置;rc是属于shell自己的配置,是用户无关的。

etc下的属于全局配置,相比home目录下的配置往往优先级更高。

etc下的rc的设计理念是:一些好的shell配置大家都会使用到的。

etc下的profile就是每个用户都共有的login配置。

参考:https://blog.csdn.net/ZoeYen_/article/details/78560905