1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-06 21:41:48 +02:00

nix-shell: Fix $PATH handling in the impure case

We were passing "p=$PATH" rather than "p=$PATH;", resulting in some
invalid shell code.

Also, construct a separate environment for the child rather than
overwriting the parent's.
This commit is contained in:
Eelco Dolstra 2016-09-20 15:39:08 +02:00
parent 9fc4cb2ae9
commit 4de0639105
3 changed files with 55 additions and 29 deletions

View file

@ -59,6 +59,21 @@ string getEnv(const string & key, const string & def)
}
std::map<std::string, std::string> getEnv()
{
std::map<std::string, std::string> env;
for (size_t i = 0; environ[i]; ++i) {
auto s = environ[i];
auto eq = strchr(s, '=');
if (!eq)
// invalid env, just keep going
continue;
env.emplace(std::string(s, eq), std::string(eq + 1));
}
return env;
}
Path absPath(Path path, Path dir)
{
if (path[0] != '/') {

View file

@ -8,9 +8,11 @@
#include <dirent.h>
#include <unistd.h>
#include <signal.h>
#include <functional>
#include <limits>
#include <cstdio>
#include <map>
#ifndef HAVE_STRUCT_DIRENT_D_TYPE
#define DT_UNKNOWN 0
@ -25,6 +27,9 @@ namespace nix {
/* Return an environment variable. */
string getEnv(const string & key, const string & def = "");
/* Get the entire environment. */
std::map<std::string, std::string> getEnv();
/* Return an absolutized path, resolving paths relative to the
specified directory, or the current directory otherwise. The path
is also canonicalised. */