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

问题描述 投票:0回答:1

使用

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"
nix nixos
1个回答
1
投票

runScript
不被视为正确的 bash 脚本,而是直接粘贴在
exec
语句开头之后。

生成的代码变成任一

exec
echo one
echo two

exec echo one
echo two

因为

''
删除了起始换行符。

不带参数的

exec
在 bash 中是无操作,因此第一个示例恰好按预期运行;但是
exec echo one
echo one
进程替换了 shell 解释器,这不是你想要的。

似乎应该弃用

runScript
参数,并用两个不言自明的可选参数替换,除非此行为是由最近的更改引起的,这将使其成为回归(错误)。

© www.soinside.com 2019 - 2024. All rights reserved.