Shell scripts: Difference between revisions
m Add category development and shell |
m capitalize sentences |
||
| (3 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
The package <code>writeShellScript</code> can be used to add shell scripts to nix expressions | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
someBuildHelper = { name, sha256 }: | |||
stdenv.mkDerivation { | |||
inherit name; | |||
outputHashMode = "recursive"; | |||
outputHashAlgo = "sha256"; | |||
outputHash = sha256; | |||
builder = writeShellScript "builder.sh" '' | |||
echo "hi, my name is ''${0}" # escape bash variable | |||
echo "hi, my hash is ${sha256}" # use nix variable | |||
echo "hello world" >output.txt | |||
''; | |||
}; | |||
</syntaxHighlight> | </syntaxHighlight> | ||
| Line 20: | Line 20: | ||
Longer bash scripts are usually stored as external script files, and called from Nix: | Longer bash scripts are usually stored as external script files, and called from Nix: | ||
{{file|default.nix|nix|3= | |||
{ | { | ||
outputTxtDrv = stdenv.mkDerivation rec { | outputTxtDrv = stdenv.mkDerivation rec { | ||
| Line 36: | Line 35: | ||
}; | }; | ||
} | } | ||
}} | |||
{{file|builder.sh|sh|3= | |||
echo "$someString $(echo "$someJson" | jq -r '.dst') $someNumber" >$out | echo "$someString $(echo "$someJson" | jq -r '.dst') $someNumber" >$out | ||
}} | |||
See also | See also | ||
| Line 52: | Line 50: | ||
Instead of <code>stdenv.mkDerivation</code>, we can also use <code>runCommand</code> to call an external bash script: | Instead of <code>stdenv.mkDerivation</code>, we can also use <code>runCommand</code> to call an external bash script: | ||
{{file|default.nix|nix|3= | |||
{ | { | ||
outputTxtDrv = runCommand "output.txt" { | outputTxtDrv = runCommand "output.txt" { | ||
| Line 63: | Line 60: | ||
} (builtins.readFile ./builder.sh); | } (builtins.readFile ./builder.sh); | ||
} | } | ||
}} | |||
== Packaging == | == Packaging == | ||
Example: | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
| Line 104: | Line 101: | ||
=== Command not found === | === Command not found === | ||
For example, the script throws the error <code>svn: command not found</code>, because the dependency <code>subversion</code> is missing. | |||
When a command is missing, you can use <code>nix-locate</code> to find the package name. for example, the <code>stat</code> command: | |||
<syntaxHighlight lang="console"> | <syntaxHighlight lang="console"> | ||
$ nix-locate bin/stat | grep 'bin/stat$' | $ nix-locate bin/stat | grep 'bin/stat$' | ||
coreutils.out | coreutils.out 0 s /nix/store/vr96j3cxj75xsczl8pzrgsv1k57hcxyp-coreutils-8.31/bin/stat | ||
</syntaxHighlight> | </syntaxHighlight> | ||
| Line 119: | Line 116: | ||
To trace commands and line numbers, we can use | To trace commands and line numbers, we can use | ||
{{file|test-trace.nix|nix|3= | |||
{ runCommand, coreutils }: | { runCommand, coreutils }: | ||
runCommand "output.txt" { nativeBuildInputs = [ coreutils ]; } '' | |||
# line 5 in nix file = line 1 in bash script -> offset 4 | |||
PS4='+ Line $(expr $LINENO + 4): ' | |||
set -o xtrace # print commands | |||
echo hello >$out # line 9 in nix file | |||
set +o xtrace # hide commands | |||
'' | |||
}} | |||
<syntaxHighlight lang="console"> | <syntaxHighlight lang="console"> | ||
| Line 147: | Line 142: | ||
== Posix Shell == | == Posix Shell == | ||
Some environments (like OpenWRT, via <code>busybox</code>) offer only a "limited" shell (<code>sh</code> instead of <code>bash</code>). | |||
On NixOS, posix shells are provided by the packages <code>dash</code> and <code>posh</code>. | |||
== See also == | == See also == | ||
* [[Nix-shell shebang]] | |||
* [https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-functions Shell functions section in the Nixpkgs manual] | * [https://nixos.org/manual/nixpkgs/stable/#ssec-stdenv-functions Shell functions section in the Nixpkgs manual] | ||
* [https://gist.github.com/travisbhartwell/f972aab227306edfcfea nix-shell and Shebang Lines] | * [https://gist.github.com/travisbhartwell/f972aab227306edfcfea nix-shell and Shebang Lines] | ||