Scsh -- a Scheme Shell

Scsh 简介

与其说 Scsh 是一个 shell ,还不如说他是一个完整的 scheme 的实现。事实 上,他是在 Scheme 481 的基础上做出来的,任何现有的 scheme 代码都可以 不加修改地在他里面运行2,另外,他还提供了完整的 Posix 接口、完整的网络 支持、强大的字符串操、AWK 式的宏、基于 s-expression 表示的正则表达式以 及线程支持。相比之下,scsh 和 Emacs 的 elisp 是不同的,elisp 是模拟一 个 sh 类似的 shell 语法,再经过转换成为 lisp 代码再执行,而 scsh 则完 全使用 lisp 语法,下面是一个例子:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

在 scsh 里面会被写为:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) ; background a pipeline
    (< paper.tex.gz))                         ; with this redirection

Scsh 作为脚本语言

目前 scsh 并不是专门设计来作为交互使用的,而是主要作为脚本编程之用,目 前的版本甚至连最简单的命令行编辑功能都没有,我试验过,确实非常难用,你 甚至无法用 Backspace 来删除同一行上刚刚键入的字符。文档里面提供的解决办 法是使用 Commander S 作为 scsh 的上层交互界面3,Scsh 文档里面提供的 commander-s 的下载页面已经不能访问了,但是可以在sourceforge 里 scsh 的 cvs 仓库里面找到 commander-s 的源代码下载,目前我可以使用匿名登录的方式 通过 cvs 下载到:

cvs -d:pserver:anonymous@scsh.cvs.sourceforge.net:/cvsroot/scsh login
cvs -z3 -d:pserver:anonymous@scsh.cvs.sourceforge.net:/cvsroot/scsh \
    co -P commander-s

注意如果提示输入密码,只需直接回车就可以了。在这里可以找到 commander-s 的一份很不错的文档。要安装 commander-s 的话,还需要其他的东西:

把上面几个包分别装上之后,只要运行 commander-s 目录下的 install.scm 就 可以安装上了。

当然还有其他的方法:

rlwrap -c -b '(){}[].,=&^%$#@\;|' scsh

Scsh 作为系统编程语言

Scsh 提供了很多操作系统的底层操作接口,除了信号控制之外,目前的版本完 全支持 Posix 并且还有许多非 Posix 扩展,如 sockets 支持等。换句话说, 在 Scsh 里面可以使用进程操作、文件读写、目录访问、tty & pty 支持,文件 锁定、管道、日期以及环境变量等等所有的操作。这样,就可以使用 scheme 而 不是 C 语言来进行系统编程了。

Scsh 作为一个可移植的编程环境

Scsh 是为可移植性而设计的,他在 Scheme 48 的基础上实现。Scheme 48 作为 scheme 的一个字节解释器实现,可以在任何拥有 C 编译器的平台上得到编译。 Scsh 的 OS 接口也是非常具有可移植性的。目前 Scsh 代码可以不加修改地运 行在 DEC Ultrix, GNU Hurd, HP-UX, IBM AIX, Linux, NetBSD/i386, NeXTSTEP, SGI IRIX, Solaris 和 SunOS 上,并且移植到其他系统上也并非难 事。

我自己的一些脚本

这里列举一些我自己用 Scsh 写的一些脚本,以及它们的设计思路等等。

Footnote

1. Jonathan Rees 和 Richard Kelsey 说作的一个 scheme 实现。

2. 只有一个不兼容的地方,就是 symbol 在 scsh 里面是区分大小写的,就是 说: (eq? 'symbol 'Symbol) 在 scsh 里面求值会得到 #f ,而在符合 R5RS 的解释器(包含本来的 Scheme 48)上会得到 #t 。

3. 事实上,我觉得任何 shell 都应该这样设计,然后可以做一个通用的交互 前端,这样,既减轻了 shell 实现的负担,又让用户从一个 shell 迁移到 另外一个 shell 的时候减轻了许多习惯上的痛苦。

4. 引用 Plan 9 wiki 上的一句话:Developed by the people who devised Unix, i.e. Bell Labs, Plan 9 takes OS development back into the realm of research. Plan 9 is an attempt to work on the concept of operating system from the ground up, reworking the whole idea using modern concepts and technology. 关于 Plan 9 的更多东西请参见 http://cm.bell-labs.com/plan9/ 或者也可以自己 google 出更多东西来。