使用
shell.nix
运行以下 nix-shell ./shell.nix
给出预期输出:
{ pkgs ? import <nixpkgs> {} }:
(pkgs.buildFHSUserEnv {
name = "test";
runScript = "
echo one
echo two
";
}).env
one
two
正如预期的那样。
但是将双引号更改为两个单引号似乎仅执行
runScript
的第一行:
{ pkgs ? import <nixpkgs> {} }:
(pkgs.buildFHSUserEnv {
name = "test";
runScript = ''
echo one
echo two
'';
}).env
one
这很奇怪,因为两种引用样式都会评估为包含我输入的所有行的多行字符串:
$ nix-instantiate --eval -
"
first line
second line
"
"\n first line\n second line\n"
$ nix-instantiate --eval -
''
first line
second line
''
"first line\nsecond line\n"
runScript
不被视为正确的 bash 脚本,而是直接粘贴在 exec
语句开头之后。
生成的代码变成任一
exec
echo one
echo two
或
exec echo one
echo two
因为
''
删除了起始换行符。
不带参数的 exec
在 bash 中是无操作,因此第一个示例恰好按预期运行;但是 exec echo one
用 echo one
进程替换了 shell 解释器,这不是你想要的。
似乎应该弃用
runScript
参数,并用两个不言自明的可选参数替换,除非此行为是由最近的更改引起的,这将使其成为回归(错误)。