nixbang icon indicating copy to clipboard operation
nixbang copied to clipboard

A special shebang to run scripts in a nix-shell

Nixbang

Nixbang let you specify the dependencies of a script inside the script itself. It will then use nix-shell to run the script with the dependenies. This has two advantages :

  • the dependencies do not clutter the system (thanks to the magic of nix) ;
  • the script can be executed on any system without setting up anything but nixbang (and nix).

Example

Take the following script ::

#!/usr/bin/env nixbang

command = python3

packages = python34 python34Packages.requests tree

import requests print(requests) import subprocess subprocess.call(['tree'])

Making it executable and running it with get all the dependencies specified on the packages line, and run the script in an environment with all those dependencies, with the command specified in command.

Note that the dependencies can be any nixpkgs packages, meaning a python script can specify both python dependencies and commands it would like to use.

Usage

Set the beginning of you script to look like this ::

#!/usr/bin/env nixbang

command = python3

packages = python34 python34Packages.requests tree

The command line tells which command should be used to execute the script. It plays the same role as the usual shebang.

The packages line tells which dependencies are required to run the script. Remember to add the command itself!

Note

Something similar has been implemented in nix-shell since, so you might want to take a look at it : https://github.com/NixOS/nix/commit/a957893b261a4438101c205e38fe8ce62b83a121.