为什么在使用两个单引号时,`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 代替,除非此行为是由最近的更改引起的,这将使其成为回归(错误) .
运行 下面的 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 代替,除非此行为是由最近的更改引起的,这将使其成为回归(错误) .