pkgs.substitute
pkgs.substitute is a wrapper around the substitute Bash function in the standard environment.
It replaces strings in src as specified by the substitutions argument.
:::{.example #ex-pkgs-substitute}
Usage of pkgs.substitute
In a build script, the line:
substitute $infile $outfile --replace-fail @foo@ ${foopkg}/bin/foois equivalent to:
{ substitute, foopkg }:substitute { src = ./sourcefile.txt; substitutions = [ "--replace" "@foo@" "${foopkg}/bin/foo" ];}:::
pkgs.replaceVars
pkgs.replaceVars <src> <replacements> replaces all instances of @varName@ (@s included) in file src with the respective value in the attribute set replacements.
:::{.example #ex-pkgs-replace-vars}
Usage of pkgs.replaceVars
If say-goodbye.sh contains the following:
#! @bash@/bin/bash
echo @unchanged@@hello@/bin/hello --greeting @greeting@the following derivation will make substitutions to @bash@, @hello@, and @greeting@:
{ replaceVars, bash, hello,}:replaceVars ./say-goodbye.sh { inherit bash hello; greeting = "goodbye"; unchanged = null;}such that $out will result in something like the following:
#! /nix/store/s30jrpgav677fpc9yvkqsib70xfmx7xi-bash-5.2p26/bin/bash
echo @unchanged@/nix/store/566f5isbvw014h7knmzmxa5l6hshx43k-hello-2.12.1/bin/hello --greeting goodbyeNote that, in contrast to the old substituteAll, unchanged = null must explicitly be set.
Any unreferenced @...@ pattern in the source file will throw an error.
:::
pkgs.replaceVarsWith
pkgs.replaceVarsWith works the same way as pkgs.replaceVars, but additionally allows more options.
:::{.example #ex-pkgs-replace-vars-with}
Usage of pkgs.replaceVarsWith
With the example file say-goodbye.sh, consider:
{ replaceVarsWith }:replaceVarsWith { src = ./say-goodbye.sh;
replacements = { inherit bash hello; greeting = "goodbye"; unchanged = null; };
name = "say-goodbye"; dir = "bin"; isExecutable = true; meta.mainProgram = "say-goodbye";}This will make the resulting file executable, put it in bin/say-goodbye and set meta attributes respectively.
:::