Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-07-28

KMRCLを眺める(181) RUN-SHELL-COMMAND

| 13:42 | KMRCLを眺める(181) RUN-SHELL-COMMAND - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(181) RUN-SHELL-COMMAND - わだばLisperになる

今回は、KMRCLのos.lispからRUN-SHELL-COMMANDです。

前回のCOMMAND-OUTPUTは出力を取得できましたが、今回のRUN-SHELL-COMMANDは外部のコマンドを実行するのに特化しています。

動作は、

(LET ((FILE "/usr/share/dict/words")
      (OUT-FILE "/tmp/bar"))
  (WITH-OPEN-FILE (IN FILE)
    (ALEXANDRIA:WITH-OUTPUT-TO-FILE (OUT OUT-FILE)
      (LOOP :FOR LINE := (READ-LINE IN NIL) :WHILE LINE
            :DO (WRITE-LINE (STRING-UPCASE LINE) OUT))))
  (KL:RUN-SHELL-COMMAND "firefox ~A" OUT-FILE))

のようなところでしょうか。

定義は、下記のようになっていますが、処理系依存の切り分けが中身の殆どです。

(defun run-shell-command (control-string &rest args)
  "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and
synchronously execute the result using a Bourne-compatible shell,
returns (VALUES output-string pid)"
  (let ((command (apply #'format nil control-string args)))
    #+sbcl
    (sb-impl::process-exit-code
     (sb-ext:run-program
      "/bin/sh"
      (list  "-c" command)
      :input nil :output nil))

    #+(or cmu scl)
    (ext:process-exit-code
     (ext:run-program
      "/bin/sh"
      (list  "-c" command)
      :input nil :output nil))


    #+allegro
    (excl:run-shell-command command :input nil :output nil
                            :wait t)

    #+lispworks
    (system:call-system-showing-output
     command
     :shell-type "/bin/sh"
     :show-cmd nil
     :prefix ""
     :output-stream nil)

    #+clisp             ;XXX not exactly *verbose-out*, I know
    (ext:run-shell-command  command :output :terminal :wait t)

    #+openmcl
    (nth-value 1
               (ccl:external-process-status
                (ccl:run-program "/bin/sh" (list "-c" command)
                                 :input nil :output nil
                                 :wait t)))

    #-(or openmcl clisp lispworks allegro scl cmu sbcl)
    (error "RUN-SHELL-PROGRAM not implemented for this Lisp")

    ))

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100728