Hi, guys, I’d like to make my nix script file into executable file via some shebang.
My first solution is use the nix-shell
shebang like following:
(the file is named test.nix
and chmod +x test.nix
is executed)
#!/usr/bin/env nix-shell
#! nix-shell test.nix
{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/c9a97ff47bb0db44f4a504015a5d1cedb3094c85.tar.gz") {} }:
(pkgs.buildFHSUserEnv {
name = "bash";
targetPkgs = pkgs: (with pkgs; [
python37
python37Packages.pip
python37Packages.virtualenv
stdenv.cc.cc.lib
pythonManylinuxPackages.manylinux2014Package
]);
profile = ''
run-some-test --with-some-args
'';
}).env
But I cannot pass extra command line argument to bash
this way.
So I think I can pass CLI arguments like:
$(nix-build --pure xxx.nix)/bin/bash --some-args
But I want to make it simple for users who need to run this test file and might not familier with nix. So the best way is to write the above line into the shebang of the nix file, is it possible?
nix-wrap
#!/usr/bin/env bash
#echo '$@ = ' "$@"
nixfile="$1"; shift
#echo "nixfile =" "$nixfile"
outpath="$(nix-build --pure $nixfile)"
#echo "outpath =" "$outpath"
This file has been truncated. show original
venv.nix
#!/usr/bin/env nix-wrap
# Usages:
#$ nix run -f ./venv.nix '' -- -c 'python --version'
#$ nix run -f ./venv.nix ''
#$ nix bundle -f ./venv.nix
let
makeOverridable = f: f {} // { override = y: makeOverridable (x: f (x // y)); };
in
This file has been truncated. show original
Usage:
$ ./venv.nix bash -c "echo hi"
1 Like
You can also achieve this without a wrapper, but I wouldn’t recommend it, as it’s not officially supported and probably won’t remain stable.
There was some exploration in this direction (including some positively disgusting shebangs) in this thread:
Edit: Want to execute a .nix like “./whatever”?
Use this and add parameters to the inner arguments. There must always be at least one.
#! /usr/bin/env nix-shell
#! nix-shell -i "nix-shell -v" -p ""
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
This was edited nonlinearly and may contain inconsistencies.
To my massive irritation, calling nix-shell on a nix file that isn’t in $PWD fails:
[nix-shell:/run/user/1000/tmp.6T3BRBy0aN/lol]$ ../uncursed.nix
evaluating file '/nix/store/ppgcg2ns9sqq5dqzm…