命令行式Shell(Command Line Interface
Shell)
不同的Shell的本质都是为了给用户提供一个在操作系统下操作的便捷而安全的界面。
为了达到这个目标,每个Shell都提供了基本的功能,它们包括:
全称 | 简称 | 系统级配置 | 用户级配置 | 系统默认 |
POSIX Shell | sh | /etc/profile | ~/.profile | UNIX |
Bourne Shell | sh | /etc/profile | ~/.profile | UNIX |
Almquist Shell | ash | /etc/profile | ~/.profile | AlpineLinux |
Debian ash | dash | /etc/profile | ~/.profile | Debian GNU/Linux |
C Shell | csh | /etc/csh.cshrc | ~/.cshrc | BSD |
TC Shell | tcsh | /etc/csh.cshrc | ~/.cshrc | FreeBSD |
Korn Shell | ksh | /etc/profile | ~/.profile | OpenBSD |
Public Domain Korn Shell | pdksh | /etc/profile | ~/.profile | |
MirBSD Korn Shell | mksh | /etc/profile | ~/.profile | |
Bourne Again Shell | bash | /etc/profile | ~/.bashrc ~/.bash_profile | |
Z Shell | zsh | /etc/zprofile | ~/.zshrc | |
Friendly Interactive SHell | fish | /etc/fish/config.fish | ~/.config/fish/config.fish |
一般的,在/etc/shells
配置文件中记录了操作系统中已经存在了哪些命令行式Shell。
示例:
这里记录了操作系统中已经存在的这些命令行式Shell的位置。
一个操作系统中通常预装了不止一个Shell
,为啥要安装那么多的Shell
呢?原因如下:
Shell
能干的事情不一样,有的Shell
能力大,有的Shell
能力小。 有时候,还要限制某些Shell
的功能,不能让它太强大了,比如,游客登、普通用户、管理员这几种用户登录的时候, 用的Shell
就可能不一样。Shell
安装文件大小不一样,这个为啥重要呢?因为今天容器化的时代,容器太大的话影响下载速度,不利于快速构建。Shell
运行速度不一样,一些功能很强大的Shell
运行速度可能就会降低,对于很在乎启动速度的系统, 就会使用极简的Shell
(启动的时候,会加载大量的配置文件,这些配置文件通常是Shell
脚本)。GNU/Linux和macOS等系统默认使用的登录Shell是bash,我们也可以切换到其他的命令行式Shell。
通过chsh命令进行切换,示例:
chsh -s $(command -v zsh)
重新登录后,Terminal就会使用切换后的Shell
。
登录Shell
是你登录系统之后使用的默认Shell
,但是你可以零时换成其他的Shell
, 只要使用对应的Shell
命令即可切换。
环境变量SHELL
记录了你使用的是哪个Shell进行登录的, 但是并不会记录你零时切换到哪个Shell了。
如果你是在Terminal中直接执行命令, 而不是通过Shell脚本执行命令, 那么,你可以通过如下命令获得你当前用的是哪个Shell:
echo $0
注意:$0
在Shell脚本里是这个脚本的文件名。
在Shell
脚本中判断当前运行时是哪个Shell
:
if command -v which > /dev/null && [ "$(type which)" = "which is a shell builtin" ]; then
echo "this is zsh $ZSH_VERSION";
elif command -v caller > /dev/null && [ "$(type caller)" = "caller is a shell builtin" ]; then
echo "this is bash $BASH_VERSION";
elif command -v enum > /dev/null && [ "$(type enum)" = "enum is a special shell builtin" ]; then
echo "this is ksh $KSH_VERSION";
else
echo "this is ash";
fi
依据:
Shell | 特有的内部命令 | 特有的环境变量 |
zsh | which | ZSH_VERSION |
bash | caller | BASH_VERSION |
ksh | enum | KSH_VERSION |
tcsh | builtins | version 、tcsh |