diff options
author | Travis A. Everett <travis.a.everett@gmail.com> | 2022-01-20 20:32:19 -0600 |
---|---|---|
committer | Travis A. Everett <travis.a.everett@gmail.com> | 2022-01-21 10:47:06 -0600 |
commit | bdb5e0382106d3238cae69095cd1f9ea04679951 (patch) | |
tree | a6024508a23947e757fabd544b2f6b93d89b1b17 | |
parent | 067076287bf601f8fa2ffe4feff3057b96fa5be8 (diff) |
install-darwin: dodge bash 3.2 command bug
The script is trying to find chown in a cross-platform-like
way, but there's some sort of deficiency in `command -p` in
the default macOS bash 3.2. It looks like it will just use
whatever PATH is already set, instead of the "default" path.
This attempts to hard-set a PATH via `getconf PATH`. It will
just set an empty PATH if that fails for some reason. A
properly-functioning `command -p` should not care what we
set the PATH to here one way or the other.
Hopefully fixes #5768.
-rw-r--r-- | scripts/install-multi-user.sh | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/scripts/install-multi-user.sh b/scripts/install-multi-user.sh index 3a24296ee..33e4eaa14 100644 --- a/scripts/install-multi-user.sh +++ b/scripts/install-multi-user.sh @@ -576,18 +576,37 @@ create_directories() { # since this bit is cross-platform: # - first try with `command -vp` to try and find # chown in the usual places + # * to work around some sort of deficiency in + # `command -p` in macOS bash 3.2, we also add + # PATH="$(getconf PATH 2>/dev/null)". As long as + # getconf is found, this should set a sane PATH + # which `command -p` in bash 3.2 appears to use. + # A bash with a properly-working `command -p` + # should ignore this hard-set PATH in favor of + # whatever it obtains internally. See + # github.com/NixOS/nix/issues/5768 # - fall back on `command -v` which would find # any chown on path # if we don't find one, the command is already # hiding behind || true, and the general state # should be one the user can repair once they # figure out where chown is... - local get_chr_own="$(command -vp chown)" + local get_chr_own="$(PATH="$(getconf PATH 2>/dev/null)" command -vp chown)" if [[ -z "$get_chr_own" ]]; then get_chr_own="$(command -v chown)" fi - _sudo "to take root ownership of existing Nix store files" \ - "$get_chr_own" -R "root:$NIX_BUILD_GROUP_NAME" "$NIX_ROOT" || true + + if [[ -z "$get_chr_own" ]]; then + reminder <<EOF +I wanted to take root ownership of existing Nix store files, +but I couldn't locate 'chown'. (You may need to fix your PATH.) +To manually change file ownership, you can run: + sudo chown -R 'root:$NIX_BUILD_GROUP_NAME' '$NIX_ROOT' +EOF + else + _sudo "to take root ownership of existing Nix store files" \ + "$get_chr_own" -R "root:$NIX_BUILD_GROUP_NAME" "$NIX_ROOT" || true + fi fi _sudo "to make the basic directory structure of Nix (part 1)" \ install -dv -m 0755 /nix /nix/var /nix/var/log /nix/var/log/nix /nix/var/log/nix/drvs /nix/var/nix{,/db,/gcroots,/profiles,/temproots,/userpool} /nix/var/nix/{gcroots,profiles}/per-user |