为什么在使用两个单引号时,`buildFHSUserEnv` 中的 `runScript =` 在第一行后停止?

Why does `runScript =` in `buildFHSUserEnv` stop after first line when using two single quotes?

运行 下面的 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 中的 no-op,因此它的行为恰好符合预期,但 exec echo one 将 shell 解释器替换为echo one 进程,这不是您想要的。

似乎应该弃用 runScript 参数并用两个可选参数 self-explanatory 代替,除非此行为是由最近的更改引起的,这将使其成为回归(错误) .