diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2017-01-03T10·40+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2017-01-03T10·40+0100 |
commit | c287e797a889202b1d603be4b445b961c37fb9b5 (patch) | |
tree | 15866d304dc23c38018c0c21d14fde8a9d91b55f | |
parent | ae1e4dfad29e24739c7f280b1a96e16ba1b54d3a (diff) |
nix-shell: In #! mode, pass the last argument
"i < argc - 1" should be "i < argc".
-rwxr-xr-x | src/nix-build/nix-build.cc | 24 | ||||
-rw-r--r-- | tests/nix-shell.sh | 4 | ||||
-rwxr-xr-x | tests/shell.shebang.sh | 2 |
3 files changed, 14 insertions, 16 deletions
diff --git a/src/nix-build/nix-build.cc b/src/nix-build/nix-build.cc index ef959fa00938..c67148728722 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) diff --git a/tests/nix-shell.sh b/tests/nix-shell.sh index 12a0ecd03c13..26cc521bbcbf 100644 --- a/tests/nix-shell.sh +++ b/tests/nix-shell.sh @@ -17,5 +17,5 @@ output=$(NIX_PATH=nixpkgs=shell.nix nix-shell --pure -p foo bar --run 'echo "$(f sed -e "s|@ENV_PROG@|$(type -p env)|" shell.shebang.sh > $TEST_ROOT/shell.shebang.sh chmod a+rx $TEST_ROOT/shell.shebang.sh -output=$($TEST_ROOT/shell.shebang.sh) -[ "$output" = "foo bar" ] +output=$($TEST_ROOT/shell.shebang.sh abc def) +[ "$output" = "foo bar abc def" ] diff --git a/tests/shell.shebang.sh b/tests/shell.shebang.sh index 544e2821750f..3dadd591572d 100755 --- a/tests/shell.shebang.sh +++ b/tests/shell.shebang.sh @@ -1,4 +1,4 @@ #! @ENV_PROG@ nix-shell #! nix-shell -I nixpkgs=shell.nix --option use-binary-caches false #! nix-shell --pure -i bash -p foo bar -echo "$(foo) $(bar)" +echo "$(foo) $(bar) $@" |