about summary refs log tree commit diff
path: root/scripts/nix-build.in
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2015-01-08T14·14+0100
committerEelco Dolstra <eelco.dolstra@logicblox.com>2015-01-08T14·14+0100
commit128538ef06aa1075b82a1c559e11f6e445514858 (patch)
tree7a7db47e2d4fec212ed7cbe0f172279f966598c1 /scripts/nix-build.in
parentb76589206a1303fb2dca073f6ec01bc71fc0fab2 (diff)
nix-shell: Add --run flag
‘--run’ is like ‘--command’, except that it runs the command in a
non-interactive shell. This is important if you do things like:

  $ nix-shell --command make

Hitting Ctrl-C while make is running drops you into the interactive
Nix shell, which is probably not what you want. So you can now do

  $ nix-shell --run make

instead.
Diffstat (limited to 'scripts/nix-build.in')
-rwxr-xr-xscripts/nix-build.in9
1 files changed, 7 insertions, 2 deletions
diff --git a/scripts/nix-build.in b/scripts/nix-build.in
index 12826323c3e3..4339899fc074 100755
--- a/scripts/nix-build.in
+++ b/scripts/nix-build.in
@@ -16,6 +16,7 @@ my $runEnv = $0 =~ /nix-shell$/;
 my $pure = 0;
 my $fromArgs = 0;
 my $packages = 0;
+my $interactive = 1;
 
 my @instArgs = ();
 my @buildArgs = ();
@@ -158,10 +159,11 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
         $runEnv = 1;
     }
 
-    elsif ($arg eq "--command") {
+    elsif ($arg eq "--command" || $arg eq "--run") {
         $n++;
         die "$0: ‘$arg’ requires an argument\n" unless $n < scalar @ARGV;
         $envCommand = "$ARGV[$n]\nexit";
+        $interactive = 0 if $arg eq "--run";
     }
 
     elsif ($arg eq "--exclude") {
@@ -286,7 +288,10 @@ foreach my $expr (@exprs) {
             'unset TZ; ' . (defined $ENV{'TZ'} ? "export TZ='${ENV{'TZ'}}'; " : '') .
             $envCommand);
         $ENV{BASH_ENV} = $rcfile;
-        exec($ENV{NIX_BUILD_SHELL} // "bash", "--rcfile", $rcfile);
+        my @args = ($ENV{NIX_BUILD_SHELL} // "bash");
+        push @args, "--rcfile" if $interactive;
+        push @args, $rcfile;
+        exec @args;
         die;
     }