UNIX® Shell之间的最终差异
本教程正在编写中(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的相关信息。
结论
结合前文内容,进一步探讨差异与相似之处。需要特别注意的是,尽管存在差异……但我认为相似性更为重要。毕竟,正是这些相似性使得用户能够轻松地在不同终端之间切换。
注释:
$Id: shells.html,v 1.3 2021/06/17 22:55:38 brainman Exp brainman $