summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stream.c29
-rw-r--r--txr.125
2 files changed, 35 insertions, 19 deletions
diff --git a/stream.c b/stream.c
index d001f704..496342ae 100644
--- a/stream.c
+++ b/stream.c
@@ -3037,21 +3037,6 @@ val open_process(val name, val mode_str, val args)
}
#endif
-static val sh(val command)
-{
- char *cmd = utf8_dup_to(c_str(command));
- int status = system(cmd);
- if (status < 0)
- return nil;
-#if HAVE_SYS_WAIT
- if (WIFEXITED(status)) {
- int exitstatus = WEXITSTATUS(status);
- return num(exitstatus);
- }
-#endif
- return status == 0 ? zero : nil;
-}
-
#if HAVE_FORK_STUFF
static val run(val name, val args)
{
@@ -3102,6 +3087,11 @@ static val run(val name, val args)
return status == 0 ? zero : nil;
}
}
+
+static val sh(val command)
+{
+ return run(lit("/bin/sh"), list(lit("-c"), command, nao));
+}
#elif HAVE_WSPAWN
static val run(val command, val args)
{
@@ -3126,12 +3116,13 @@ static val run(val command, val args)
return (status < 0) ? nil : num(status);
}
-#else
-static val run(val command, val args)
+
+static val sh(val command)
{
- val win_cmdline = win_make_cmdline(cons(command, default_bool_arg(args)));
- return sh(win_cmdline);
+ return run(lit("cmd.exe"), list(lit("/C"), command, nao));
}
+#else
+#error port me!
#endif
val remove_path(val path)
diff --git a/txr.1 b/txr.1
index 6be080c6..b662380c 100644
--- a/txr.1
+++ b/txr.1
@@ -32561,6 +32561,31 @@ value from the failed
.code exec
attempt.
+Note: as of \*(TX 120, the
+.code sh
+function is implemented using
+.code run
+and not by means of the
+.code system
+C library function, as previously. The
+.code run
+function is used to invoke the system interpreter by name. On Unix-like
+systems, the string
+.code /bin/sh
+is assumed to denote the system interpreter, which is expected to
+support a pair of arguments
+.cblk
+.meti -c < command
+.cble
+to specify the command to be executed. On MS Windows, the interpreter
+is assumed to be the relative path name
+.code cmd.exe
+and expected to support
+.cblk
+.meti /C < command
+.cble
+as a way of specifying a command to execute.
+
.SS* Unix Filesystem Manipulation
.coNP Structure @ stat