代码之家  ›  专栏  ›  技术社区  ›  akaihola dnlcrl

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

  •  0
  • akaihola dnlcrl  · 技术社区  · 4 年前

    运行以下 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"
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Robert Hensing Nguyen Hoang Hiep    4 年前

    runScript 不被视为适当的bash脚本,而是直接粘贴在 exec 陈述

    生成的代码变为

    exec
    echo one
    echo two
    

    exec echo one
    echo two
    

    因为 '' 删除起始换行符。

    exec bash本身就是一个no-op,所以它的行为与预期的一样,但是 exec echo one 将shell解释器替换为 echo one 过程,这不是你想要的。

    看起来 runScript 参数应该被弃用,并用两个不言自明的可选参数替换,除非这种行为是由最近的更改引起的,这将使其成为回归(bug)。

    推荐文章