anchor.diff:                          {start_clean, undefined, "start-clean", boolean,
                            "Cancel any applications in the 'apps' list "
                            "or release."},
  +                        {env_file, undefined, "env-file", string,
  +                         "Path to file of os environment variables to setup "
  +                         "before expanding vars in config files."},
                           {user_drv_args, undefined, "user_drv_args", string,
                            "Arguments passed to user_drv start function for "
                            "creating custom shells."}]}
  
positive.code:     Result.
  
  maybe_boot_apps(State) ->
      case find_apps_to_boot(State) of
          undefined ->
              %% try to read in sys.config file
  
negative.code:             rebar_file_utils:consult_config_terms(State, Terms)
      end.
  
  maybe_set_env_vars(State) ->
      EnvFile =debug_get_value(env_file, rebar_state:get(State, shell, []), undefined,
                               "Found env_file from config."),
      {Opts, _} = rebar_state:command_parsed_args(State),
      EnvFile1 = debug_get_value(env_file, Opts, EnvFile,
                                 "Found env_file from command line option."),
  
      case maybe_read_file(EnvFile1) of
          ignore ->
              ok;
          {error, _} ->
              ?WARN("Failed to read file with environment variables: ~p", [EnvFile1]);
          {ok, Bin} ->
              Lines = string:split(unicode:characters_to_list(Bin), "\n", all),
              [handle_env_var_line(Line) || Line <- Lines]
      end.
  
  handle_env_var_line(Line) ->
      Trimmed = string:trim(Line, both, [$ ]),
      %% ignore lines starting with # and
      %% fail if there are spaces around =
      case re:run(Trimmed, "^(?<key>[^#][^\s=]*)=(?<value>[^\s]\.*)",
                  [{capture, [key, value], list}, unicode]) of
          {match, [Key, Value]} ->
              os:putenv(Key, Value);
          _ ->
              case Trimmed of
                  [$# | _] -> ignore;
                  [] -> ignore;
                  Other ->
                      ?WARN("Unable to parse environment variable from this line: ~ts", [Other])
              end
      end.
  
  maybe_read_file(undefined) ->
      ignore;
  maybe_read_file(EnvFile) ->
      file:read_file(EnvFile).
  
  %% @doc quick and simple variable substitution writeup.
  %% Supports `${varname}' but not `$varname' nor nested
  %% values such as `${my_${varname}}'.
  