3889415bf8
Nix sometimes outputs a warning message like this: ``` directory /nix does not exist; creating it by running ‘?? using sudo ``` ... when it really meant to output something that looked like this: ``` directory /nix does not exist; creating it by running 'mkdir -m 0755 /nix && chown gabriel /nix' using sudo ``` The reason why is due to some bizarre behavior in Bash where it will translate anything of the form `$x’` to `??`, leading to the incorrect warning message. I don't know what is the origin of this Bash behavior, but the easiest fix is to just use ASCII quotes instead of unicode quotes.
128 lines
3.2 KiB
Bash
128 lines
3.2 KiB
Bash
#!/bin/sh
|
||
|
||
set -e
|
||
|
||
dest="/nix"
|
||
self="$(dirname "$0")"
|
||
nix="@nix@"
|
||
cacert="@cacert@"
|
||
|
||
if ! [ -e $self/.reginfo ]; then
|
||
echo "$0: incomplete installer (.reginfo is missing)" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if [ -z "$USER" ]; then
|
||
echo "$0: \$USER is not set" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$(id -u)" -eq 0 ]; then
|
||
printf '\e[1;31mwarning: installing Nix as root is not supported by this script!\e[0m\n'
|
||
fi
|
||
|
||
echo "performing a single-user installation of Nix..." >&2
|
||
|
||
if ! [ -e $dest ]; then
|
||
cmd="mkdir -m 0755 $dest && chown $USER $dest"
|
||
echo "directory $dest does not exist; creating it by running '$cmd' using sudo" >&2
|
||
if ! sudo sh -c "$cmd"; then
|
||
echo "$0: please manually run ‘$cmd’ as root to create $dest" >&2
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
if ! [ -w $dest ]; then
|
||
echo "$0: directory $dest exists, but is not writable by you. This could indicate that another user has already performed a single-user installation of Nix on this system. If you wish to enable multi-user support see http://nixos.org/nix/manual/#ssec-multi-user. If you wish to continue with a single-user install for $USER please run ‘chown -R $USER $dest’ as root." >&2
|
||
exit 1
|
||
fi
|
||
|
||
mkdir -p $dest/store
|
||
|
||
echo -n "copying Nix to $dest/store..." >&2
|
||
|
||
for i in $(cd $self/store >/dev/null && echo *); do
|
||
echo -n "." >&2
|
||
i_tmp="$dest/store/$i.$$"
|
||
if [ -e "$i_tmp" ]; then
|
||
rm -rf "$i_tmp"
|
||
fi
|
||
if ! [ -e "$dest/store/$i" ]; then
|
||
cp -Rp "$self/store/$i" "$i_tmp"
|
||
chmod -R a-w "$i_tmp"
|
||
chmod +w "$i_tmp"
|
||
mv "$i_tmp" "$dest/store/$i"
|
||
chmod -w "$dest/store/$i"
|
||
fi
|
||
done
|
||
echo "" >&2
|
||
|
||
echo "initialising Nix database..." >&2
|
||
if ! $nix/bin/nix-store --init; then
|
||
echo "$0: failed to initialize the Nix database" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if ! $nix/bin/nix-store --load-db < $self/.reginfo; then
|
||
echo "$0: unable to register valid paths" >&2
|
||
exit 1
|
||
fi
|
||
|
||
. $nix/etc/profile.d/nix.sh
|
||
|
||
if ! $nix/bin/nix-env -i "$nix"; then
|
||
echo "$0: unable to install Nix into your default profile" >&2
|
||
exit 1
|
||
fi
|
||
|
||
# Install an SSL certificate bundle.
|
||
if [ -z "$SSL_CERT_FILE" -o ! -f "$SSL_CERT_FILE" ]; then
|
||
$nix/bin/nix-env -i "$cacert"
|
||
export SSL_CERT_FILE="$HOME/.nix-profile/etc/ssl/certs/ca-bundle.crt"
|
||
fi
|
||
|
||
# Subscribe the user to the Nixpkgs channel and fetch it.
|
||
if ! $nix/bin/nix-channel --list | grep -q "^nixpkgs "; then
|
||
$nix/bin/nix-channel --add https://nixos.org/channels/nixpkgs-unstable
|
||
fi
|
||
if [ -z "$_NIX_INSTALLER_TEST" ]; then
|
||
$nix/bin/nix-channel --update nixpkgs
|
||
fi
|
||
|
||
# Make the shell source nix.sh during login.
|
||
p=$NIX_LINK/etc/profile.d/nix.sh
|
||
|
||
added=
|
||
for i in .bash_profile .bash_login .profile; do
|
||
fn="$HOME/$i"
|
||
if [ -w "$fn" ]; then
|
||
if ! grep -q "$p" "$fn"; then
|
||
echo "modifying $fn..." >&2
|
||
echo "if [ -e $p ]; then . $p; fi # added by Nix installer" >> $fn
|
||
fi
|
||
added=1
|
||
break
|
||
fi
|
||
done
|
||
|
||
if [ -z "$added" ]; then
|
||
cat >&2 <<EOF
|
||
|
||
Installation finished! To ensure that the necessary environment
|
||
variables are set, please add the line
|
||
|
||
. $p
|
||
|
||
to your shell profile (e.g. ~/.profile).
|
||
EOF
|
||
else
|
||
cat >&2 <<EOF
|
||
|
||
Installation finished! To ensure that the necessary environment
|
||
variables are set, either log in again, or type
|
||
|
||
. $p
|
||
|
||
in your shell.
|
||
EOF
|
||
fi
|