Nix-shell shebang: Difference between revisions

imported>Milahu
add link: Nix Flakes, Part 2: Evaluation caching - Tweag
YoshiRulz (talk | contribs)
C#: Add EntryPointFileDirectoryPath to sample, new in preview 6
 
(9 intermediate revisions by 7 users not shown)
Line 7: Line 7:
The first shebang line is always <code>#! /usr/bin/env nix-shell</code>.<br>
The first shebang line is always <code>#! /usr/bin/env nix-shell</code>.<br>
The second shebang line declares the script language and the script dependencies.
The second shebang line declares the script language and the script dependencies.
As of Nix 2.19.0 you can also use the new CLI <code>nix shell</code> and flakes to define shebangs. See [https://nixos.org/manual/nix/stable/command-ref/new-cli/nix.html?highlight=shebang#shebang-interpreter docs].


== Examples ==
== Examples ==
Line 30: Line 32:
convert "$1" -scale 50% "$1.s50.jpg" &&
convert "$1" -scale 50% "$1.s50.jpg" &&
cowsay "done $1.q50.jpg"
cowsay "done $1.q50.jpg"
</syntaxHighlight>
=== C# ===
Using file-based apps, new in .NET 10:
<syntaxHighlight lang="csharp">
#!/usr/bin/env nix-shell
/*
#! nix-shell -i dotnet -p dotnetCorePackages.dotnet_10.sdk
*/
#:package Humanizer@2.14.1
using Humanizer;
Environment.CurrentDirectory = (string) AppContext.GetData("EntryPointFileDirectoryPath")!; // equivalent of `cd $(dirname $0)`
var dotNet9Released = DateTimeOffset.Parse("2024-12-03");
var since = DateTimeOffset.Now - dotNet9Released;
Console.WriteLine($"It has been {since.Humanize()} since .NET 9 was released.");
</syntaxHighlight>
</syntaxHighlight>


Line 98: Line 121:
</syntaxHighlight>
</syntaxHighlight>


=== Haskell ===
<syntaxHighlight lang="haskell">
#! /usr/bin/env nix-shell
#! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [turtle])" -i runghc
{-# LANGUAGE OverloadedStrings #-}
import Turtle
main = echo "Hello world!"
</syntaxHighlight>


== Pinning nixpkgs ==
== Pinning nixpkgs ==
Line 106: Line 140:
#! /usr/bin/env nix-shell
#! /usr/bin/env nix-shell
#! nix-shell -i bash
#! nix-shell -i bash
#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs-channels/archive/nixos-18.03.tar.gz
#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/aed4b19d312525ae7ca9bceb4e1efe3357d0e2eb.tar.gz


echo hello world
echo hello world
</syntaxHighlight>
</syntaxHighlight>
== Flake ==
It is also possible to make it work for flake like in:
<syntaxHighlight lang="bash">
#!/usr/bin/env -S nix shell nixpkgs#bash nixpkgs#hello nixpkgs#cowsay --command bash
hello | cowsay
</syntaxHighlight>
The [https://nix.dev/manual/nix/2.19/command-ref/new-cli/nix3-shell doc] mentions that it should be possible to run more complex commands using multiple lines, but it does not work for me as reported [https://github.com/NixOS/nixpkgs/issues/280033 here].


== Performance ==
== Performance ==
Line 125: Line 171:
* [https://gist.github.com/travisbhartwell/f972aab227306edfcfea nix-shell and Shebang Lines]
* [https://gist.github.com/travisbhartwell/f972aab227306edfcfea nix-shell and Shebang Lines]
* [https://notes.yukiisbo.red/posts/2021/07/Spice_up_with_Nix_Scripts.html Spice up with Nix: Scripts with magical dependencies]
* [https://notes.yukiisbo.red/posts/2021/07/Spice_up_with_Nix_Scripts.html Spice up with Nix: Scripts with magical dependencies]
[[Category:Nix]]
[[Category:Shell]]