1 ;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
6 ;;;; Purpose: Operating System utilities
7 ;;;; Programmer: Kevin M. Rosenberg
8 ;;;; Date Started: Jul 2003
12 ;;;; *************************************************************************
16 (defun command-output (control-string &rest args)
17 "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and
18 synchronously execute the result using a Bourne-compatible shell,
19 returns (VALUES string-output error-output exit-status)"
20 (let ((command (apply #'format nil control-string args)))
22 (let ((process (sb-ext:run-program
25 :input nil :output :stream :error :stream)))
27 (sb-impl::process-output process)
28 (sb-impl::process-error process)
29 (sb-impl::process-exit-code process)))
32 (let ((process (ext:run-program
35 :input nil :output :stream :error :stream)))
37 (ext::process-output process)
38 (ext::process-error process)
39 (ext::process-exit-code process)))
42 (multiple-value-bind (output error status)
43 (excl.osi:command-output command :whole t)
44 (values output error status))
47 ;; BUG: Lispworks combines output and error streams
48 (let ((output (make-output-string-stream)))
51 (system:call-system-showing-output
54 :output-stream output)))
55 (values (get-output-string output) nil status))
59 ;; BUG: CLisp doesn't allow output to user-specified stream
63 (ext:run-shell-command command :output :terminal :wait t))
66 (let* ((process (ccl:run-program
69 :input nil :output :stream :error :stream
71 (output (read-stream-to-string (ccl::external-process-output-stream process)))
72 (error (read-stream-to-string (ccl::external-process-error-stream process))))
73 (close (ccl::external-process-output-stream process))
74 (close (ccl::external-process-error-stream process))
77 (nth-value 1 (ccl::external-process-status process))))
79 #-(or openmcl clisp lispworks allegro scl cmu sbcl)
80 (error "COMMAND-OUTPUT not implemented for this Lisp")
84 (defun run-shell-command (control-string &rest args)
85 "Interpolate ARGS into CONTROL-STRING as if by FORMAT, and
86 synchronously execute the result using a Bourne-compatible shell,
87 returns (VALUES output-string pid)"
88 (let ((command (apply #'format nil control-string args)))
90 (sb-impl::process-exit-code
94 :input nil :output nil))
97 (ext:process-exit-code
101 :input nil :output nil))
105 (excl:run-shell-command command :input nil :output nil
109 (system:call-system-showing-output
111 :shell-type "/bin/sh"
112 :output-stream output)
114 #+clisp ;XXX not exactly *verbose-out*, I know
115 (ext:run-shell-command command :output :terminal :wait t)
119 (ccl:external-process-status
120 (ccl:run-program "/bin/sh" (list "-c" command)
121 :input nil :output nil
124 #-(or openmcl clisp lispworks allegro scl cmu sbcl)
125 (error "RUN-SHELL-PROGRAM not implemented for this Lisp")