Shell scripts/zh: Difference between revisions
Created page with "某些环境(例如基于 BusyBox 的 OpenWRT)仅提供“受限” Shell(使用 <code>sh</code> 而非 <code>bash</code>)" |
Created page with "函数 <code>writeShellScript</code> 可用于向 Nix 表达式中添加 Shell 脚本。" Tags: Mobile edit Mobile web edit |
||
| (13 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
<languages/> | <languages/> | ||
函数 <code>writeShellScript</code> 可用于向 Nix 表达式中添加 Shell 脚本。 | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
| Line 20: | Line 18: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
< | <span id="External_builder.sh_script"></span> | ||
== | == 外部 builder.sh 脚本 == | ||
较长的 Bash 脚本通常会保存为外部脚本文件,并在 Nix 中调用: | |||
{{file|default.nix|nix|3= | {{file|default.nix|nix|3= | ||
| Line 49: | Line 44: | ||
}} | }} | ||
另见: | |||
* [https://github.com/NixOS/nixpkgs/issues/23099 创造一个无源 derivation] | |||
* [https://github.com/NixOS/nixpkgs/issues/23099 | * [https://nixos.org/guides/nix-pills/working-derivation.html Nix Pills: 第 7 章. 制作 Derivation] | ||
* [https://nixos.org/guides/nix-pills/working-derivation.html Nix Pills: | |||
=== runCommand + builder.sh === | === runCommand + builder.sh === | ||
除了使用 <code>stdenv.mkDerivation</code> 之外,还可以通过 <code>runCommand</code> 来调用外部的 Bash 脚本: | |||
{{file|default.nix|nix|3= | {{file|default.nix|nix|3= | ||
| Line 78: | Line 65: | ||
}} | }} | ||
< | <span id="Packaging"></span> | ||
== | == 打包 == | ||
示例: | |||
<syntaxHighlight lang="nix"> | <syntaxHighlight lang="nix"> | ||
| Line 117: | Line 101: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
<code>wrapProgram</code> 会将原始脚本移动到 <code>.github-downloader.sh-wrapped</code>。 | |||
<code>wrapProgram</code> | |||
< | <span id="Command_not_found"></span> | ||
=== | === 命令未找到 === | ||
例如,脚本会抛出错误 <code>svn: command not found</code>,这是因为缺少依赖包 <code>subversion</code>。 | |||
当某个命令缺失时,可以使用 <code>nix-locate</code> 来查找对应的软件包名称。例如,<code>stat</code> 命令: | |||
<syntaxHighlight lang="console"> | <syntaxHighlight lang="console"> | ||
| Line 138: | Line 115: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
< | <span id="Debugging_embedded_scripts"></span> | ||
== | == 调试嵌入脚本 == | ||
当 Bash 脚本执行失败时,它只会输出错误信息,而不会显示出错的代码位置。 | |||
要跟踪命令和行号,可以使用 | |||
{{file|test-trace.nix|nix|3= | {{file|test-trace.nix|nix|3= | ||
| Line 174: | Line 146: | ||
</syntaxHighlight> | </syntaxHighlight> | ||
== POSIX shell == | == POSIX shell == | ||
某些环境(例如基于 BusyBox 的 OpenWRT)仅提供“受限” Shell(使用 <code>sh</code> 而非 <code>bash</code>) | 某些环境(例如基于 BusyBox 的 OpenWRT)仅提供“受限” Shell(使用 <code>sh</code> 而非 <code>bash</code>) | ||