aboutsummaryrefslogtreecommitdiff
path: root/src/nix-build
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-01-03 11:40:51 +0100
committerEelco Dolstra <edolstra@gmail.com>2017-01-03 11:40:51 +0100
commitc287e797a889202b1d603be4b445b961c37fb9b5 (patch)
tree15866d304dc23c38018c0c21d14fde8a9d91b55f /src/nix-build
parentae1e4dfad29e24739c7f280b1a96e16ba1b54d3a (diff)
nix-shell: In #! mode, pass the last argument
"i < argc - 1" should be "i < argc".
Diffstat (limited to 'src/nix-build')
-rwxr-xr-xsrc/nix-build/nix-build.cc24
1 files changed, 11 insertions, 13 deletions
diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc
index ef959fa00..c67148728 100755
--- a/src/nix-build/nix-build.cc
+++ b/src/nix-build/nix-build.cc
@@ -105,6 +105,7 @@ int main(int argc, char ** argv)
std::vector<string> args;
for (int i = 1; i < argc; ++i)
args.push_back(argv[i]);
+
// Heuristic to see if we're invoked as a shebang script, namely, if we
// have a single argument, it's the name of an executable file, and it
// starts with "#!".
@@ -115,7 +116,7 @@ int main(int argc, char ** argv)
if (std::regex_search(lines.front(), std::regex("^#!"))) {
lines.pop_front();
inShebang = true;
- for (int i = 2; i < argc - 1; ++i)
+ for (int i = 2; i < argc; ++i)
savedArgs.push_back(argv[i]);
args.clear();
for (auto line : lines) {
@@ -288,9 +289,8 @@ int main(int argc, char ** argv)
// executes it unless it contains the string "perl" or "indir",
// or (undocumented) argv[0] does not contain "perl". Exploit
// the latter by doing "exec -a".
- if (std::regex_search(interpreter, std::regex("perl"))) {
- execArgs = "-a PERL";
- }
+ if (std::regex_search(interpreter, std::regex("perl")))
+ execArgs = "-a PERL";
std::ostringstream joined;
for (const auto & i : savedArgs)
@@ -301,7 +301,6 @@ int main(int argc, char ** argv)
// read the shebang to understand which packages to read from. Since
// this is handled via nix-shell -p, we wrap our ruby script execution
// in ruby -e 'load' which ignores the shebangs.
-
envCommand = (format("exec %1% %2% -e 'load(\"%3%\") -- %4%") % execArgs % interpreter % script % joined.str()).str();
} else {
envCommand = (format("exec %1% %2% %3% %4%") % execArgs % interpreter % script % joined.str()).str();
@@ -421,7 +420,7 @@ int main(int argc, char ** argv)
// environment variables and shell functions. Also don't lose
// the current $PATH directories.
auto rcfile = (Path) tmpDir + "/rc";
- writeFile(rcfile, (format(
+ writeFile(rcfile, fmt(
"rm -rf '%1%'; "
"[ -n \"$PS1\" ] && [ -e ~/.bashrc ] && source ~/.bashrc; "
"%2%"
@@ -435,13 +434,12 @@ int main(int argc, char ** argv)
"unset NIX_INDENT_MAKE; "
"shopt -u nullglob; "
"unset TZ; %4%"
- "%5%"
- )
- % (Path) tmpDir
- % (pure ? "" : "p=$PATH; ")
- % (pure ? "" : "PATH=$PATH:$p; unset p; ")
- % (getenv("TZ") ? (string("export TZ='") + getenv("TZ") + "'; ") : "")
- % envCommand).str());
+ "%5%",
+ (Path) tmpDir,
+ (pure ? "" : "p=$PATH; "),
+ (pure ? "" : "PATH=$PATH:$p; unset p; "),
+ (getenv("TZ") ? (string("export TZ='") + getenv("TZ") + "'; ") : ""),
+ envCommand));
Strings envStrs;
for (auto & i : env)