UNIX® Shell之间的最终差异

来自tutorials.sdfcn.org - sdf中文html教程
跳转到导航 跳转到搜索

本教程正在编写中(work in progress,WIP)。

介绍

本教程中介绍的 UNIX shell 包括:osh(Thompson shell 的移植)、sh(和类似 sh 的 shell)、csh(和类似 csh 的 shell)以及其他 shell。

各种 UNIX[1] shell 之间有哪些重要的区别和/或相似之处?不同之处一般是命令行语法问题。

在下面的章节中,每个命令行示例都用 "Ecl [123]: "表示。比较每节中的 "Ecl [123]: "和其他章节中相应的 "Ecl [123]:",就能了解这些 shell 的不同之处

本教程中描述的各种UNIX shell之间的共同点比差异更为重要。这是因为当你学会使用一种shell时,实际上也学会了使用其他shell。从用户的角度来看,每种shell都扮演着相同的角色。这个角色就是作为UNIX操作系统中可用功能的接口。

Thompson Shell

在UNIX历史中,Thompson shell 早于 Bourne shell 和 C shell 出现,其命令语言是这两种壳的子集。Thompson shell 的流程控制通过外部壳工具if(1)和goto(1)实现。然而,Bourne shell 和 C shell 的流程控制则内置于各自的壳中。

增强版的Thompson shell已在SDF上提供,路径为`/usr/pkg/bin/osh`。您可以在命令提示符下执行`man osh`来查看其手册。如果您更喜欢在线阅读,也可以访问其在线手册

Ecl 1:

% setenv PATH /usr/pkg/bin:/usr/bin:/bin ; printenv PATH
/usr/pkg/bin:/usr/bin:/bin

Ecl 2:

% which osh if goto ^ ( tr '\n' ' ' ; echo ) ^ sed 's/.*/ls -l &/' ^ osh
-r-xr-xr-x  1 root  wheel   7880 Jul 18 21:37 /usr/pkg/bin/goto
-r-xr-xr-x  1 root  wheel  14160 Jul 18 21:37 /usr/pkg/bin/if
-r-xr-xr-x  1 root  wheel  38216 Jul 18 21:37 /usr/pkg/bin/osh

Ecl 3:

% if -r /netbsd echo /netbsd: Is readable ; \
  if -w /netbsd echo /netbsd: Is writable
/netbsd: Is readable

...

请注意,上述的 `setenv` 命令在原始的 Thompson 壳中不可用。这是 osh 增强功能之一。我们是否需要对 PWB shell[2] 说些什么?

Bourne Shell

这包括原始Bourne shell、衍生版本以及类似实现。真正的Bourne shell或类Bourne shell通常作为大多数UNIX系统上的标准命令解释器。

在SDF上,有一个与Bourne shell类似的命令行解释器,其路径为`/bin/sh`。您可以在命令提示符下输入`man sh`来查看其手册。如果您更喜欢在线阅读,也可以通过在线方式查看其手册。

Ecl 1:

$ PATH=/usr/pkg/bin:/usr/bin:/bin ; export PATH ; printenv PATH
/usr/pkg/bin:/usr/bin:/bin

Ecl 2:

$ ls -l `which sh ksh bash`
-r-xr-xr-x  1 root  wheel  298431 Oct 24  2005 /bin/ksh
-r-xr-xr-x  1 root  wheel  199717 Oct 24  2005 /bin/sh
-rwxr-xr-x  1 root  wheel  963696 Jun  4 08:57 /usr/pkg/bin/bash

Ecl 3:

$ if test -r /netbsd ; then echo /netbsd: Is readable ; fi ; \
> if test -w /netbsd ; then echo /netbsd: Is writable ; fi
/netbsd: Is readable

Bourne-Again Shell

Bourne-Again shell(Bash)是为GNU项目开发的自由软件,旨在替代Bourne shell。Bash能够在不进行任何修改的情况下执行绝大多数Bourne shell脚本。然而,其语法包含许多在Bourne shell中不存在的扩展功能。

Bourne-Again shell 在 SDF 上可通过 `/usr/pkg/bin/bash` 访问。您可以在命令提示符下执行 `man bash` 命令来查看其手册。

Ecl 1:

$ PATH=/usr/pkg/bin:/usr/bin:/bin ; export PATH ; printenv PATH
/usr/pkg/bin:/usr/bin:/bin

Ecl 2:

$ ls -l `which sh ksh bash`
-r-xr-xr-x  1 root  wheel  298431 Oct 24  2005 /bin/ksh
-r-xr-xr-x  1 root  wheel  199717 Oct 24  2005 /bin/sh
-rwxr-xr-x  1 root  wheel  963696 Jun  4 08:57 /usr/pkg/bin/bash

Ecl 3:

$ if test -r /netbsd ; then echo /netbsd: Is readable ; fi ; \
> if test -w /netbsd ; then echo /netbsd: Is writable ; fi
/netbsd: Is readable

Z Shell

Z shell(Zsh)是Bourne shell的扩展版本,包含了许多改进。Paul Falstad于1990年在普林斯顿大学编写了Zsh的第一个版本。

Z shell在SDF上可通过`/usr/pkg/bin/zsh`访问。您可以在命令提示符下执行`man zsh`来阅读其手册。

Ecl 1:

% PATH=/usr/pkg/bin:/usr/bin:/bin ; export PATH ; printenv PATH
/usr/pkg/bin:/usr/bin:/bin

Ecl 2:

% ls -l `which csh tcsh zsh`
-r-xr-xr-x  1 root  wheel  214333 Oct 24  2005 /bin/csh
-r-xr-xr-x  1 root  wheel  459408 Jun 29  2005 /usr/pkg/bin/tcsh
-r-xr-xr-x  2 root  wheel    6352 May 11  2007 /usr/pkg/bin/zsh

Ecl 3:

% if test -r /netbsd ; then echo /netbsd: Is readable ; fi ; \
> if test -w /netbsd ; then echo /netbsd: Is writable ; fi
/netbsd: Is readable

C Shell

这包括原始的C shell、衍生版本以及类似实现。

C shell在SDF上以`/bin/csh`的形式提供。您可以在命令提示符下执行`man csh`来查看其手册。如果您更愿意在线查看,也可以通过网络阅读其手册。

Ecl 1:

% setenv PATH /usr/pkg/bin:/usr/bin:/bin ; printenv PATH
/usr/pkg/bin:/usr/bin:/bin

Ecl 2:

% ls -l `which csh tcsh zsh`
-r-xr-xr-x  1 root  wheel  214333 Oct 24  2005 /bin/csh
-r-xr-xr-x  1 root  wheel  459408 Jun 29  2005 /usr/pkg/bin/tcsh
-r-xr-xr-x  2 root  wheel    6352 May 11  2007 /usr/pkg/bin/zsh

Ecl 3:

% if (-r /netbsd) echo /netbsd: Is readable ; \
  if (-w /netbsd) echo /netbsd: Is writable
/netbsd: Is readable

其他 Shells

这一部分是否必要?

本部分将包含关于Z shell、rc(AT&T Plan 9 shell)以及任何其他无法明确归类到单一类别的UNIX shell的相关信息。

结论

结合前文内容,进一步探讨差异与相似之处。需要特别注意的是,尽管存在差异……但我认为相似性更为重要。毕竟,正是这些相似性使得用户能够轻松地在不同终端之间切换。


注释:

  1. UNIX® 是 The Open Group 的注册商标。
  2. 此 PWB shell 也是Thompson Shell 的改进。 --译者注

$Id: shells.html,v 1.3 2021/06/17 22:55:38 brainman Exp brainman $