diff options
author | Lin Jian <me@linj.tech> | 2023-02-20 02:26:31 +0800 |
---|---|---|
committer | Lin Jian <me@linj.tech> | 2023-03-13 17:25:04 +0800 |
commit | 8e2e741ab5bdea119a34013b1387eb3f281841cb (patch) | |
tree | 883f74ab5bd15b82cdb004ec68f47f4e726d4048 /pkgs/shells | |
parent | 2ed116f7a1724ba726a265f6f5ba1985c91ef833 (diff) | |
download | nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.tar nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.tar.gz nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.tar.bz2 nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.tar.lz nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.tar.xz nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.tar.zst nixpkgs-8e2e741ab5bdea119a34013b1387eb3f281841cb.zip |
zsh: set environment variables in zshenv instead of zprofile
This patch fixes two issues: 1. The file in which environment variables are set is inconsistent. - This file sets them in zprofile when programs.zsh.enable is not set. - Zsh module sets them in zshenv when programs.zsh.enable is set. 2. Setting environment variables in zprofile overrides what users set in .zshenv. See these[1] home-manager[2] issues[3]. /etc/profile is also changed to /etc/set-environment. Here is a comparison: Using /etc/profile: - Pros - config.environment.shellInit is sourced in all zsh - Cons - config.environment.loginShellInit is also sourced in non-login zsh - config.programs.bash.shellInit is also sourced in all zsh - config.programs.bash.loginShellInit is also sourced in all zsh Using /etc/set-environment: - Pros - config.programs.bash.shellInit is not sourced in any zsh - config.programs.bash.loginShellInit is not sourced in any zsh - Cons - config.environment.shellInit is not sourced in any zsh - config.environment.loginShellInit is not sourced in any zsh [1]: https://github.com/nix-community/home-manager/issues/2751#issuecomment-1048682643 [2]: https://github.com/nix-community/home-manager/issues/2991 [3]: https://github.com/nix-community/home-manager/issues/3681#issuecomment-1436054233
Diffstat (limited to 'pkgs/shells')
-rw-r--r-- | pkgs/shells/zsh/default.nix | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/pkgs/shells/zsh/default.nix b/pkgs/shells/zsh/default.nix index 5a003b889a0..3a5a83ad1f8 100644 --- a/pkgs/shells/zsh/default.nix +++ b/pkgs/shells/zsh/default.nix @@ -42,7 +42,7 @@ stdenv.mkDerivation { "--enable-multibyte" "--with-tcsetpgrp" "--enable-pcre" - "--enable-zprofile=${placeholder "out"}/etc/zprofile" + "--enable-zshenv=${placeholder "out"}/etc/zshenv" "--disable-site-fndir" ] ++ lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform && !stdenv.hostPlatform.isStatic) [ # Also see: https://github.com/buildroot/buildroot/commit/2f32e668aa880c2d4a2cce6c789b7ca7ed6221ba @@ -64,34 +64,36 @@ stdenv.mkDerivation { postInstall = '' make install.info install.html mkdir -p $out/etc/ - cat > $out/etc/zprofile <<EOF + cat > $out/etc/zshenv <<EOF if test -e /etc/NIXOS; then - if test -r /etc/zprofile; then - . /etc/zprofile + if test -r /etc/zshenv; then + . /etc/zshenv else emulate bash alias shopt=false - . /etc/profile + if [ -z "$__NIXOS_SET_ENVIRONMENT_DONE" ]; then + . /etc/set-environment + fi unalias shopt emulate zsh fi - if test -r /etc/zprofile.local; then - . /etc/zprofile.local + if test -r /etc/zshenv.local; then + . /etc/zshenv.local fi else - # on non-nixos we just source the global /etc/zprofile as if we did + # on non-nixos we just source the global /etc/zshenv as if we did # not use the configure flag - if test -r /etc/zprofile; then - . /etc/zprofile + if test -r /etc/zshenv; then + . /etc/zshenv fi fi EOF ${if stdenv.hostPlatform == stdenv.buildPlatform then '' - $out/bin/zsh -c "zcompile $out/etc/zprofile" + $out/bin/zsh -c "zcompile $out/etc/zshenv" '' else '' - ${lib.getBin buildPackages.zsh}/bin/zsh -c "zcompile $out/etc/zprofile" + ${lib.getBin buildPackages.zsh}/bin/zsh -c "zcompile $out/etc/zshenv" ''} - mv $out/etc/zprofile $out/etc/zprofile_zwc_is_used + mv $out/etc/zshenv $out/etc/zshenv_zwc_is_used rm $out/bin/zsh-${version} mkdir -p $out/share/doc/ |