aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis A. Everett <travis.a.everett@gmail.com>2022-01-20 20:32:19 -0600
committerTravis A. Everett <travis.a.everett@gmail.com>2022-01-21 10:47:06 -0600
commitbdb5e0382106d3238cae69095cd1f9ea04679951 (patch)
treea6024508a23947e757fabd544b2f6b93d89b1b17
parent067076287bf601f8fa2ffe4feff3057b96fa5be8 (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.sh25
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