summary refs log tree commit diff
path: root/pkgs/shells
diff options
context:
space:
mode:
authorLin Jian <me@linj.tech>2023-02-20 02:26:31 +0800
committerLin Jian <me@linj.tech>2023-03-13 17:25:04 +0800
commit8e2e741ab5bdea119a34013b1387eb3f281841cb (patch)
tree883f74ab5bd15b82cdb004ec68f47f4e726d4048 /pkgs/shells
parent2ed116f7a1724ba726a265f6f5ba1985c91ef833 (diff)
downloadnixpkgs-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.nix28
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/