about summary refs log tree commit diff
path: root/src/nix/run.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-08-29T12·28+0200
committerEelco Dolstra <edolstra@gmail.com>2017-08-29T12·42+0200
commit5cc8609e30ab4f76053f3159c51ea78d9215bc8c (patch)
tree1a8d1d78f82389280f6c59954b8f82bdb2823f43 /src/nix/run.cc
parent93a5ef0516881ec133fc5e54069add6dd64ffbdd (diff)
nix run: Allow passing a command to execute
E.g.

  nix run nixpkgs.hello -c hello --greeting Hallo

Note that unlike "nix-shell --command", no quoting of arguments is
necessary.

"-c" (short for "--command") cannot be combined with "--" because they
both consume all remaining arguments. But since installables shouldn't
start with a dash, this is unlikely to cause problems.
Diffstat (limited to 'src/nix/run.cc')
-rw-r--r--src/nix/run.cc16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/nix/run.cc b/src/nix/run.cc
index e58e2f187a..39fbcc8acf 100644
--- a/src/nix/run.cc
+++ b/src/nix/run.cc
@@ -17,8 +17,20 @@ std::string chrootHelperName = "__run_in_chroot";
 
 struct CmdRun : InstallablesCommand
 {
+    Strings command = { "bash" };
+
     CmdRun()
     {
+        mkFlag()
+            .longName("command")
+            .shortName('c')
+            .description("command and arguments to be executed; defaults to 'bash'")
+            .arity(ArityAny)
+            .labels({"command", "args"})
+            .handler([&](Strings ss) {
+                if (ss.empty()) throw UsageError("--command requires at least one argument");
+                command = ss;
+            });
     }
 
     std::string name() override
@@ -43,8 +55,8 @@ struct CmdRun : InstallablesCommand
                 unixPath.push_front(path + "/bin");
         setenv("PATH", concatStringsSep(":", unixPath).c_str(), 1);
 
-        std::string cmd = "bash";
-        Strings args = { cmd };
+        std::string cmd = *command.begin();
+        Strings args = command;
 
         /* If this is a diverted store (i.e. its "logical" location
            (typically /nix/store) differs from its "physical" location