diff --git a/asdf.lisp b/asdf.lisp
index 4c419f1da3cc0cabefc4434251b04438768d20d6..c53e04a884e2092da0509b963d860cce00237ba4 100644
--- a/asdf.lisp
+++ b/asdf.lisp
@@ -1,4 +1,4 @@
-;;; This is asdf: Another System Definition Facility.  $Revision: 1.30 $
+;;; This is asdf: Another System Definition Facility.  $Revision: 1.31 $
 ;;;
 ;;; The canonical source for asdf is presently the cCLan CVS repository,
 ;;; at <URL:http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/cclan/asdf/>
@@ -815,4 +815,27 @@ output to *trace-output*.  Returns the shell's exit code."
       (list  "-c" command)
       :input nil :output *trace-output*))))
 
+#+allegro
+(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, with
+output to *trace-output*.  Returns the shell's exit code."
+  (let ((command (apply #'format nil control-string args)))
+    (format *trace-output* "; $ ~A~%" command)
+     (excl:run-shell-command
+      (make-array 3 :initial-contents (list "/bin/sh" "-c" command))
+      :input nil :output *trace-output*)))
+
+#+lispworks
+(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, with
+output to *trace-output*.  Returns the shell's exit code."
+  (let ((command (apply #'format nil control-string args)))
+    (format *trace-output* "; $ ~A~%" command)
+     (system:call-system-showing-output
+      command
+      :shell-type "/bin/sh"
+      :output-stream *trace-output*)))
+
 (pushnew :asdf *features*)