Shell和Bash

Last Updated: 2023-06-18 06:25:00 Sunday

-- TOC --

Shell是一个概念,一种键盘命令行文化,Bash只是它的一种实现,但确是事实上的标准!不想找麻烦,就要与Bash兼容。

人机交互界面有很多种类,命令行是最原始的,但也是功能最强大的,它可以调用系统中的任何程序。

Shell的概念和种类

Shell 是一个程序,提供一个系统与用户对话的环境。这个环境只有一个命令提示符,让用户从键盘输入指令,所以又称为命令行环境(command line interface,简写为 CLI)。Shell 接收到用户输入的命令,调用命令对应的程序,执行,并将结果返回给用户。

Shell 是一个命令解释器,解释用户输入的命令。它支持变量、条件判断、循环操作等语法,所以用户可以用 Shell 命令写出各种小程序,又称为Shell脚本。这些脚本都通过 Shell 解释执行,不需要编译。

历史上,主要的 Shell 有下面这些:

Bourne Shell(sh)

Almquist shells (ash,dash就是ash,Debian)

Bourne Again shell(bash)

C Shell(csh)(Bill Joy作品,vi也是他写的)

TENEX C Shell(tcsh)

Korn shell(ksh)

Z Shell(zsh)

Friendly Interactive Shell(fish)

Bash和zsh(Mac系统)是目前最常用的Shell。

查看当前Shell

$ echo $SHELL
/bin/bash

查看系统所有Shell

$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash

关于zsh的一点信息:Linux系统使用zsh,需要单独安装,Mac系统默认就有zsh。据说zsh配置狂复杂,所以很多人都不会使用。直到有一天出了Oh My Zsh项目(https://github.com/robbyrussell/oh-my-zsh),才让更多人发现并开始使用zsh。有人说zsh是终极shell。zsh很漂亮,很炫酷,以前是极客使用,现在小白通过oh-my-zsh可以装逼。

关于ash:Due to copyright issues surrounding the Bourne Shell as it was used in historic CSRG BSD releases, Kenneth Almquist developed a clone of the Bourne Shell, known by some as the Almquist shell and available under the BSD license, which is in use today on some BSD descendants and in low-memory situations. The Almquist Shell was ported to Linux, and the port renamed the Debian Almquist shell, or dash. This shell provides faster execution of standard sh (and POSIX-standard sh, in modern descendants) scripts with a smaller memory footprint than its counterpart, Bash. Its use tends to expose bashisms – bash-centric assumptions made in scripts meant to run on sh.

Ubuntu系统中sh指向dash,没有ash!busybox有ash和sh,我理解应该是一样的,只是入口不同。

貌似现在主要就是bash和ash或dash,bash还在不停地升级,额.....

终端模拟器

模拟的是古老的计算机TTY终端...

如果是不带有图形环境的 Linux 系统(比如专用于服务器的系统),启动后就直接是命令行环境。

不过,现在大部分的 Linux 发行版,尤其是针对普通用户的发行版,都是图形环境。用户登录系统后,自动进入图形环境,需要自己启动终端模拟器,才能进入命令行环境。

所谓“终端模拟器”(terminal emulator)就是一个模拟命令行窗口的程序,让用户在一个窗口中使用命令行环境,并且提供各种附加功能,比如调整颜色、字体大小、行距等等。

不同 Linux 发行版(准确地说是不同的桌面环境)带有的终端程序是不一样的,比如 KDE 桌面环境的终端程序是 konsole,Gnome 桌面环境的终端程序是 gnome-terminal,用户也可以安装第三方的终端程序。所有终端程序,尽管名字不同,基本功能都是一样的,就是让用户可以进入命令行环境,使用 Shell。

Linux用户其实已经习惯了使用Shell,就算是在GUI界面下,也是开一大堆terminal,跑各种脚本和程序。对于没有GUI的Linux系统,Shell就是唯一与系统交互的方式了!

Shell和Bash的历史

Shell 伴随着 Unix 系统的诞生而诞生。

1969年,Ken Thompson 和 Dennis Ritchie 开发了第一版的 Unix。

1971年,Ken Thompson 编写了最初的 Shell,称为 Thompson shell,程序名是sh,方便用户使用 Unix。

1973年至1975年间,John R. Mashey 扩展了最初的 Thompson shell,添加了编程功能,使得 Shell 成为一种编程语言。这个版本的 Shell 称为 Mashey shell。

1976年,Stephen Bourne 结合 Mashey shell 的功能,重写一个新的 Shell,称为 Bourne shell。

1978年,加州大学伯克利分校的 Bill Joy 开发了 C shell,为 Shell 提供 C 语言的语法,程序名是csh。它是第一个真正替代sh的 UNIX shell,被合并到 Berkeley UNIX 的 2BSD 版本中。

1979年,UNIX 第七版发布,内置了 Bourne Shell,导致它成为 Unix 的默认 Shell。注意,Thompson shell、Mashey shell 和 Bourne shell 都是贝尔实验室的产品,程序名都是sh。对于用户来说,它们是同一个东西,只是底层代码不同而已。

1983年,David Korn 开发了Korn shell,程序名是ksh。

1985年,Richard Stallman 成立了自由软件基金会(FSF),由于 Shell 的版权属于贝尔公司,所以他决定写一个自由版权的、使用 GNU 许可证的 Shell 程序,避免 Unix 的版权争议。

1988年,自由软件基金会的第一个付薪程序员 Brian Fox 写了一个 Shell,功能基本上是 Bourne shell 的克隆,叫做 Bourne-Again SHell,简称 Bash,程序名为bash,任何人都可以免费使用。后来,它逐渐成为 Linux 系统的标准 Shell。

1989年,Bash 发布1.0版。

1996年,Bash 发布2.0版。

2004年,Bash 发布3.0版。

2009年,Bash 发布4.0版。

2019年,Bash 发布5.0版。

查看Bash版本

$ bash --version
GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

$ echo $BASH_VERSION
5.0.17(1)-release

rbash是什么

rbash,restricted bash shell,是有功能限制的bash,它给linux的bash shell提供一层额外的安全机制。

进入rbash:

$ rbash
$ # or
$ bash -r
$ set -r  # no new process and no going back

哪些功能受限:

  1. cd命令,不允许更换pwd;
  2. 修改$PATH;
  3. 修改环境变量;
  4. import function;
  5. 重定向功能不可用;
  6. 不运行自行解除显示,即 set +r
  7. Specifying file name containing argument / or -
$ rbash
$ cd
rbash: cd: restricted
$ echo 'i am in rbash' > a.txt
rbash: a.txt: restricted: cannot redirect output

但是在rbash下,依然可以执行脚本文件,此时所有限制会解除,也可以直接在rbash下再进入一个不受限制的bash,额......

本文链接:https://cs.pynote.net/sf/linux/shell/202110136/

-- EOF --

-- MORE --