Zsh does not load /etc/profile values by default

  • Open
  • quality assurance status badge
Details
3 participants
  • Danny O'Brien
  • Leo Prikler
  • Ludovic Courtès
Owner
unassigned
Submitted by
Danny O'Brien
Severity
normal
D
D
Danny O'Brien wrote on 17 Nov 2019 08:14
(address . bug-guix@gnu.org)
CAAkY2scspbLnrX2Ufg10_w2SvkwdFqtDO7Xbm0oyw0BthgPhtg@mail.gmail.com
Right now, an installation of zsh as a primary shell won't read in the
environmental settings in /etc/profile -- it looks for (but doesn't
find) a /etc/zprofile file instead.

Not sure what the correct approach should be here. We could symlink
/etc/zprofile to /etc/profile , but that would require knowing that
/etc/profile was always available. Or we could include a source'ing of
/etc/profile in /etc/zprofile.

I'm not sure what status /etc/profile holds in Guix -- is it the
canonical location for any user-wide environment settings? Will it be
guaranteed to be POSIXly correct, rather than having any bashisms?

Thanks for your work,

d.
Attachment: file
L
L
Leo Prikler wrote on 17 Nov 2019 14:21
(address . danny@spesh.com)(address . 38243@debbugs.gnu.org)
02c4cef07e9f519697b9bbe9c6ab116fa2e2a404.camel@student.tugraz.at
Toggle quote (4 lines)
> I'm not sure what status /etc/profile holds in Guix -- is it the
> canonical location for any user-wide environment settings? Will it
> be
> guaranteed to be POSIXly correct, rather than having any bashisms?
It is currently not and I'm not sure whether it will be. The current
behaviour is known to cause problems with fish, though, so a proper
solution would be appreciated. The real culprit seems likely to be
$GUIX_PROFILE/etc/profile, which are sourced by /etc/profile. As far
as zsh is concerned, it does seem to work despite the bashisms, as long
as you can get it to source /etc/profile.

Toggle quote (5 lines)
> Not sure what the correct approach should be here. We could symlink
> /etc/zprofile to /etc/profile , but that would require knowing that
> /etc/profile was always available. Or we could include a source'ing
> of
> /etc/profile in /etc/zprofile.
I'd rather generate a separate file. In zsh, you would also have to
expand fpath to include Guix' autocompletion stuff, which works out of
the box for bash. Given the aforementioned bashisms in
$GUIX_PROFILE/etc/profile, we may also want to keep a
$GUIX_PROFILE/etc/zprofile, although ideally we would make our profiles
POSIXly correct instead.

Regards,
Leo
L
L
Ludovic Courtès wrote on 17 Nov 2019 22:42
(name . Danny O'Brien)(address . danny@spesh.com)(address . 38243@debbugs.gnu.org)
878soei3ih.fsf@gnu.org
Hi Danny,

"Danny O'Brien" <danny@spesh.com> skribis:

Toggle quote (12 lines)
> Right now, an installation of zsh as a primary shell won't read in the
> environmental settings in /etc/profile -- it looks for (but doesn't
> find) a /etc/zprofile file instead.
>
> Not sure what the correct approach should be here. We could symlink
> /etc/zprofile to /etc/profile , but that would require knowing that
> /etc/profile was always available. Or we could include a source'ing of
> /etc/profile in /etc/zprofile.
>
> I'm not sure what status /etc/profile holds in Guix -- is it the
> canonical location for any user-wide environment settings?

There’s also /etc/environment, honored by ‘pam_env’, and thus
shell-independent.

Toggle quote (3 lines)
> Will it be guaranteed to be POSIXly correct, rather than having any
> bashisms?

It’s meant to be POSIX. If you notice Bash-specific constructs, we can
surely remove those (I see a couple of “export VAR=value”, which is not
POSIX, but maybe Zsh supports it?).

Let us know what’s needed!

Thanks,
Ludo’.
D
D
Danny O'Brien wrote on 8 Dec 2019 07:15
(name . Leo Prikler)(address . leo.prikler@student.tugraz.at)(address . 38243@debbugs.gnu.org)
CAAkY2sdQN9Vczi=5_a_-=tZU8kwnd+Mhen--Lh_3maCu7NfaVQ@mail.gmail.com
On Sun, Nov 17, 2019 at 5:22 AM Leo Prikler <leo.prikler@student.tugraz.at>
wrote:

Toggle quote (7 lines)
> > Not sure what the correct approach should be here. We could symlink
> > /etc/zprofile to /etc/profile , but that would require knowing that
> > /etc/profile was always available. Or we could include a source'ing
> > of
> > /etc/profile in /etc/zprofile.
>

I took a closer look at this, and currently Zsh users have /etc/profile
included in their environment by virtue of a default $HOME/.zprofile, which
is created in their home directory when they are created (via `useradd` and
/etc/skel ).

I'm a little stuck to know what to do here -- if we source /etc/profile in
/etc/zprofile, then we risk sourcing it twice for users who have the
current default ~/.zprofile already in their home directories`. OTOH, if
users come to Guix System with their own pre-existing home directory, then
they may well struggle --- as I did -- because important environment
variables aren't set by their established ~/.zshrc, ~/.zprofile or
~/.zlogin setups.

I *think* the right thing to do is to drop the current /etc/skel/.zprofile
and establish that /etc/zprofile (and other shells) should source
/etc/profile . Guix System does a lot of setup in /etc/profile including
including $GUIX_PROFILE/etc/profile. It would be best if this
automatically happened, whatever is going on in individual home
directories. I'm a Guix newbie though, so I'm happy to take advice!
Archlinux has a one-line /etc/zprofile which sources /etc/profile ; Debian
does not; I have not checked other distributions, but I could.

A couple of Guix commits where the current behavior was established:

commit 2f4d43584cb26315c028dfbd2197da0d175933a2
Author: Chris Marusich <cmmarusich@gmail.com>
Date: Sat Oct 13 22:50:36 2018 -0700

system: Rename .zlogin to .zprofile.

Reported by Meiyo Peng <meiyo.peng@gmail.com>.

* gnu/system/shadow.scm (default-skeletons): Rename zlogin to zprofile.

commit 02f707c590fa3c5bbd74168468bf561b47317f71
Author: Sou Bunnbu (???) <iyzsong@gmail.com>
Date: Fri Dec 5 21:17:49 2014 +0800

system: Add skeleton '.zlogin'.

* gnu/system/shadow.scm (default-skeletons): Add .zlogin.

Best,

d.
Attachment: file
L
L
Leo Prikler wrote on 8 Dec 2019 10:01
(name . Danny O'Brien)(address . danny@spesh.com)(address . 38243@debbugs.gnu.org)
59bddacf16b64ab6f5409958704608b1280b7819.camel@student.tugraz.at
Am Samstag, den 07.12.2019, 22:15 -0800 schrieb Danny O'Brien:
Toggle quote (4 lines)
> I took a closer look at this, and currently Zsh users have
> /etc/profile included in their environment by virtue of a default
> $HOME/.zprofile, which is created in their home directory when they
> are created (via `useradd` and /etc/skel ).
It appears, though, that some Guix users lack this skeleton, perhaps
those who used it before the change.

Toggle quote (7 lines)
> I'm a little stuck to know what to do here -- if we source
> /etc/profile in /etc/zprofile, then we risk sourcing it twice for
> users who have the current default ~/.zprofile already in their home
> directories`. OTOH, if users come to Guix System with their own pre-
> existing home directory, then they may well struggle --- as I did --
> because important environment variables aren't set by their
> established ~/.zshrc, ~/.zprofile or ~/.zlogin setups.
I don't think the problem is as bad as you make it out to be. If we
write channel news describing the move of .zprofile to /etc/zprofile,
people ought to see it and be able to prevent the double-sourcing.


Toggle quote (9 lines)
> I *think* the right thing to do is to drop the current
> /etc/skel/.zprofile and establish that /etc/zprofile (and other
> shells) should source /etc/profile . Guix System does a lot of setup
> in /etc/profile including including $GUIX_PROFILE/etc/profile. It
> would be best if this automatically happened, whatever is going on in
> individual home directories. I'm a Guix newbie though, so I'm happy
> to take advice! Archlinux has a one-line /etc/zprofile which sources
> /etc/profile ; Debian does not; I have not checked other
> distributions, but I could.
The real problem with $GUIX_PROFILE/etc/profile is its shell-specific
behaviour. The weird syntax used there *happens* to be supported by
zsh, but other shells (most notably fish, but e.g. also Eshell[1]) do
not like it.
To solve this problem not just for one shell, but for all of them, we
should write a portable $GUIX_PROFILE/etc/profile. Same for
/etc/profile. Then we can source it from other shells. Again,
sourcing it from /etc/zprofile is fine even without that change, as zsh
happens to eat this syntax without complaints, but other shells do not
like it.

Regards,
Leo

[1] Eshell is a weird one. Sourceing the file directly appears to
work, but does nothing. Setting $GUIX_PROFILE instead causes the user
to be prompted for an alias.
?