diff options
Diffstat (limited to 'scripts/nix-build.in')
-rwxr-xr-x | scripts/nix-build.in | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/scripts/nix-build.in b/scripts/nix-build.in index 7e1f28870309..19de6feb6080 100755 --- a/scripts/nix-build.in +++ b/scripts/nix-build.in @@ -30,6 +30,7 @@ my $myName = $runEnv ? "nix-shell" : "nix-build"; my $inShebang = 0; my $script; +my @savedArgs; my $tmpDir = mkTempDir($myName); @@ -43,13 +44,14 @@ $SIG{'INT'} = sub { exit 1 }; # 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 "#!". -if ($runEnv && scalar @ARGV == 1) { +if ($runEnv && $ARGV[0] !~ /nix-shell/) { $script = $ARGV[0]; if (-f $script && -x $script) { open SCRIPT, "<$script" or die "$0: cannot open ‘$script’: $!\n"; my $first = <SCRIPT>; if ($first =~ /^\#\!/) { $inShebang = 1; + @savedArgs = @ARGV; shift @savedArgs; @ARGV = (); while (<SCRIPT>) { chomp; @@ -193,7 +195,12 @@ for (my $n = 0; $n < scalar @ARGV; $n++) { # or (undocumented) argv[0] does not contain "perl". Exploit # the latter by doing "exec -a". my $execArgs = $interpreter =~ /perl/ ? "-a PERL" : ""; - $envCommand = "exec $execArgs $interpreter $script"; + sub shellEscape { + my $s = $_; + $s =~ s/'/'\\''/g; + return "'" . $s . "'"; + } + $envCommand = "exec $execArgs $interpreter $script ${\(join ' ', (map shellEscape, @savedArgs))}"; } elsif (substr($arg, 0, 1) eq "-") { @@ -231,7 +238,7 @@ foreach my $expr (@exprs) { # If we're in a #! script, interpret filenames relative to the # script. $expr = dirname(Cwd::abs_path($script)) . "/" . $expr - if $inShebang && $expr !~ /^\//; + if $inShebang && !$packages && $expr !~ /^\//; # !!! would prefer the perl 5.8.0 pipe open feature here. my $pid = open(DRVPATHS, "-|") || exec "$Nix::Config::binDir/nix-instantiate", "--add-root", $drvLink, "--indirect", @instArgs, $expr; |