シェルっぽいやつ

30分プログラム、その360。Unix/Linuxプログラミング理論と実践に影響されて、シェルっぽいやつを作ってみた。
パイプまでは作れなかったけど、バックグラウンドで実行するだけはつけておいた。

使い方

mzp $ gosh sh.scm
$ ls /tmp
launch-0j30hQ
launch-40D1Rw
launch-LHH7cE
launchd-63.nfqo2J
$ echo hoge
hoge

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; sh.scm -
;;
;; Copyright(C) 2008 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2008/09/07 23:23:13
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;
(use util.match)
(use srfi-1)
(define (parse line)
  (let1 cmd (string-split line #\space)
    (cond
     ((string=? "&" (last cmd)) (cons 'bg (drop-right cmd 1)))
     (else cmd))))
  
(define (eval line)
  (match (parse line)
    (("") 0)
    (('bg . cmd)
     (sys-fork-and-exec (car cmd) cmd))
    (cmd (sys-waitpid 
	  (sys-fork-and-exec (car cmd) cmd)))))

(define (loop)
  (display "$ ")
  (flush)
  (let1 line (read-line)
    (unless (eof-object? line)
      (eval line)
      (loop))))

(loop)