external-program
external-program copied to clipboard
Fix passing environment variables
I was astonished to find out that external-program does not support passing environment variables under SBCL as provided by the user, adding single quotes around them instead.
This is an attempt to improve handling of environment variables.
- Adding quotes around values is wrong. All the system calls take an array of unquoted arguments. And quoting, when necessary, is never as simple as adding single quote marks around the value.
- Adding
PATH=toenv -iis wrong; empty environment is not the one withPATHdefined to be an empty string. Yes, this allows some programs to run without full path, because asman 3 execsays, for the purpose ofexecundefined PATH defaults toconfstr(_CS_PATH)(in C) orgetconf CS_PATH(in shell), and on my system, for example, that evaluates to/bin:/usr/bin. -
should-have-access-to-shell-builtins— why? Running programs under shell is difficult to get right specifically because of quoting, and provides no benefits over running them directly (unless the user wants shell features, but external-program does not really facilitate that). -
empty-env-should-erase-all— yes, butlsmay succeed even with empty environment.
I tested the change under SBCL, CCL, CLISP and ECL.
ABCL fails the last test because it does not implement proper quoting of the arguments that it passes to shell (but it is not external-program's job to do that when its interface requires no escaping on the callers part).