1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-08 19:46:02 +01:00

nix/develop: pass down the interactive shell to subshells

This commit is contained in:
sinanmohd 2025-09-05 18:32:42 +05:30
parent 49e9c14e2f
commit 211cbe4abf

View file

@ -627,13 +627,12 @@ struct CmdDevelop : Common, MixEnvironment
fmt("[ -n \"$PS1\" ] && PS1+=%s;\n", escapeShellArgAlways(developSettings.bashPromptSuffix.get()));
}
writeFull(rcFileFd.get(), script);
setEnviron();
// prevent garbage collection until shell exits
setEnv("NIX_GCROOT", gcroot.c_str());
Path shell = "bash";
bool foundInteractive = false;
try {
auto state = getEvalState();
@ -656,19 +655,17 @@ struct CmdDevelop : Common, MixEnvironment
Strings{"legacyPackages." + settings.thisSystem.get() + "."},
nixpkgsLockFlags);
bool found = false;
for (auto & path : Installable::toStorePathSet(
getEvalStore(), store, Realise::Outputs, OperateOn::Output, {bashInstallable})) {
auto s = store->printStorePath(path) + "/bin/bash";
if (pathExists(s)) {
shell = s;
found = true;
foundInteractive = true;
break;
}
}
if (!found)
if (!foundInteractive)
throw Error("package 'nixpkgs#bashInteractive' does not provide a 'bin/bash'");
} catch (Error &) {
@ -678,6 +675,11 @@ struct CmdDevelop : Common, MixEnvironment
// Override SHELL with the one chosen for this environment.
// This is to make sure the system shell doesn't leak into the build environment.
setEnv("SHELL", shell.c_str());
// https://github.com/NixOS/nix/issues/5873
script += fmt("SHELL=\"%s\"\n", shell);
if (foundInteractive)
script += fmt("PATH=\"%s${PATH:+:$PATH}\"\n", std::filesystem::path(shell).parent_path());
writeFull(rcFileFd.get(), script);
#ifdef _WIN32 // TODO re-enable on Windows
throw UnimplementedError("Cannot yet spawn processes on Windows");