Unyablog.

のにれんのブログ

軽い Shell を作った

↓の記事を読んで自分でもサクッと作れそうなので作ってみた。

brennan.io

名前は nsh (nonylene shell の略)。記事を参考にコードを書いていたら大体同じようなものになってしまった。

github.com

記事では C で書いているけど、nsh では Python3 で書いてみた *1。結局パースで6割ぐらい占めていて、コマンドを実行するのはこの部分だけ。

def execute_line(args):
    pid = os.fork()
    if pid == 0:
        os.execvp(args[0], args)
    elif pid < 0:
        print("error with fork!")
    else:
        while True:
            wpid, status = os.waitpid(pid, os.WUNTRACED)
            if os.WIFEXITED(status) or os.WIFSIGNALED(status): break

それなりに使えるようになったので満足。

f:id:nonylene:20161209003000p:plain

fork して execvp している以外は通常の Python の処理なので、特段困ったこともなく一時間ぐらいで作れたので良かった(小並感)。

*1:今考えたらシステムコール打ちたい時に困りそうだけど、軽く作って見る分には os.fork や os.execvp を使う程度だったので大丈夫だった。