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