Re: use zsh as login shell
Here are my new patches: Yeh, just add ~/.zshrc to source /etc/profie is enough. From 42ccd7a445c9676db6d2c7b2b0583db45be245aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= iyzs...@gmail.com Date: Fri, 5 Dec 2014 20:01:07 +0800 Subject: [PATCH 1/2] system: Cleanup bash startup files. * gnu/system.scm (etc-directory) (bashrc): Rename to (profile). 'CPATH', 'LIBRARY_PATH': Remove. 'PS1', 'alias ls', 'alias ll': Move to ... * gnu/system/shadow.scm (default-skeletons): (.bashrc): ... here. Don't source /etc/profile. (.bash_profile): New skeleton. --- gnu/system.scm| 13 - gnu/system/shadow.scm | 13 + 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gnu/system.scm b/gnu/system.scm index e1ed1a2..a851ff2 100644 --- a/gnu/system.scm +++ b/gnu/system.scm @@ -384,10 +384,9 @@ This is the GNU system. Welcome.\n) (nsswitch (text-file nsswitch.conf hosts: files dns\n)) - ;; TODO: Generate bashrc from packages' search-paths. - (bashrc(text-file* bashrc -export PS1='\\u@\\h \\w\\$ ' - + ;; Startup file for POSIX-compliant login shells, which set system-wide + ;; environment variables. + (profile(text-file* profile \ export LC_ALL=\ locale \ export TZ=\ timezone \ export TZDIR=\ tzdata /share/zoneinfo\ @@ -397,11 +396,7 @@ export LINUX_MODULE_DIRECTORY=/run/booted-system/kernel/lib/modules export PATH=$HOME/.guix-profile/bin:/run/current-system/profile/bin export PATH=/run/setuid-programs:/run/current-system/profile/sbin:$PATH -export CPATH=$HOME/.guix-profile/include: profile /include -export LIBRARY_PATH=$HOME/.guix-profile/lib: profile /lib export INFOPATH=$HOME/.guix-profile/share/info:/run/current-system/profile/share/info -alias ls='ls -p --color' -alias ll='ls -l' )) (skel (skeleton-directory skeletons))) (file-union etc @@ -414,7 +409,7 @@ alias ll='ls -l' (nsswitch.conf ,#~#$nsswitch) (skel ,#~#$skel) (shells ,#~#$shells) - (profile ,#~#$bashrc) + (profile ,#~#$profile) (hosts ,#~#$hosts-file) (localtime ,#~(string-append #$tzdata /share/zoneinfo/ #$timezone)) diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm index 6970021..4a2322b 100644 --- a/gnu/system/shadow.scm +++ b/gnu/system/shadow.scm @@ -115,9 +115,13 @@ (copy-file (car (find-files #$guile-wm wm-init-sample.scm)) #$output))) - (mlet %store-monad ((bashrc (text-file bashrc \ -# Allow non-login shells such as an xterm to get things right. -test -f /etc/profile source /etc/profile\n)) + (mlet %store-monad ((profile (text-file bash_profile \ +# Honor per-interactive-shell startup file +if [ -f ~/.bashrc ]; then . ~/.bashrc; fi\n)) + (bashrc (text-file bashrc \ +PS1='\\u@\\h \\w\\$ ' +alias ls='ls -p --color' +alias ll='ls -l'\n)) (guile-wm (gexp-derivation guile-wm copy-guile-wm #:modules '((guix build utils @@ -127,7 +131,8 @@ XTerm*metaSendsEscape: true\n)) (gdbinit (text-file gdbinit \ # Tell GDB where to look for separate debugging files. set debug-file-directory ~/.guix-profile/lib/debug\n))) -(return `((.bashrc ,bashrc) +(return `((.bash_profile ,profile) + (.bashrc ,bashrc) (.Xdefaults ,xdefaults) (.guile-wm ,guile-wm) (.gdbinit ,gdbinit) -- 2.1.2 From 043e4d9b6743654e048d3495cb5bfa592d17e6c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= iyzs...@gmail.com Date: Fri, 5 Dec 2014 21:17:49 +0800 Subject: [PATCH 2/2] system: Add skeleton '.zshrc'. * gnu/system/shadow.scm (default-skeletons): Add .zshrc. --- gnu/system/shadow.scm | 4 1 file changed, 4 insertions(+) diff --git a/gnu/system/shadow.scm b/gnu/system/shadow.scm index 4a2322b..a0b9f56 100644 --- a/gnu/system/shadow.scm +++ b/gnu/system/shadow.scm @@ -122,6 +122,9 @@ if [ -f ~/.bashrc ]; then . ~/.bashrc; fi\n)) PS1='\\u@\\h \\w\\$ ' alias ls='ls -p --color' alias ll='ls -l'\n)) + (zshrc (text-file zshrc \ +# Honor system-wide environment variables +source /etc/profile\n)) (guile-wm (gexp-derivation guile-wm copy-guile-wm #:modules '((guix build utils @@ -133,6 +136,7 @@ XTerm*metaSendsEscape: true\n)) set debug-file-directory ~/.guix-profile/lib/debug\n))) (return `((.bash_profile ,profile) (.bashrc ,bashrc) + (.zshrc ,zshrc) (.Xdefaults ,xdefaults) (.guile-wm ,guile-wm)
Re: use zsh as login shell
Mark H Weaver m...@netris.org skribis: l...@gnu.org (Ludovic Courtès) writes: 宋文武 iyzs...@gmail.com skribis: + (mlet %store-monad ((bash-profile (text-file bash_profile \ +# honor ~/.bashrc if the shell is interactive +[[ $- == *i* ]] source ~/.bashrc I don’t think the test is needed, because ~/.bash_profile is only read by interactive Bash. Indeed. However, it would be good to check if ~/.bashrc exists. Section 6.2 of the Bash manual suggests this: if [ -f ~/.bashrc ]; then . ~/.bashrc; fi Yes. +# load system-wide environment varibales +source /etc/environment + +# common varibales for user profile +export PATH=$HOME/.guix-profile/bin:$HOME/.guix-profile/sbin:$PATH +export INFOPATH=$HOME/.guix-profile/share/info:$INFOPATH\n)) + (bashrc (text-file bashrc \ +PS1='\\u@\\h \\w\\$ ' I think PS1 should go to /etc/profile. WDYT? I agree with 宋文武 that the PS1 setting belongs in the default ~/.bashrc skeleton. I would prefer to keep settings like this, that are purely a matter of personal taste, out of system-wide files. Also, /etc/profile is read by other shells, and I don't know that the syntax above is portable. OK, that makes sense to me. Ludo’.
Re: use zsh as login shell
l...@gnu.org (Ludovic Courtès) writes: 宋文武 iyzs...@gmail.com skribis: + (mlet %store-monad ((bash-profile (text-file bash_profile \ +# honor ~/.bashrc if the shell is interactive +[[ $- == *i* ]] source ~/.bashrc I don’t think the test is needed, because ~/.bash_profile is only read by interactive Bash. Indeed. However, it would be good to check if ~/.bashrc exists. Section 6.2 of the Bash manual suggests this: if [ -f ~/.bashrc ]; then . ~/.bashrc; fi +# load system-wide environment varibales +source /etc/environment + +# common varibales for user profile +export PATH=$HOME/.guix-profile/bin:$HOME/.guix-profile/sbin:$PATH +export INFOPATH=$HOME/.guix-profile/share/info:$INFOPATH\n)) + (bashrc (text-file bashrc \ +PS1='\\u@\\h \\w\\$ ' I think PS1 should go to /etc/profile. WDYT? I agree with 宋文武 that the PS1 setting belongs in the default ~/.bashrc skeleton. I would prefer to keep settings like this, that are purely a matter of personal taste, out of system-wide files. Also, /etc/profile is read by other shells, and I don't know that the syntax above is portable. Regards, Mark
Re: use zsh as login shell
Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: Ludovic Courtès l...@gnu.org writes: [...] So, instead of what you suggest, what about having: 1. /etc/profile and /etc/zlogin (?) both source /etc/environment, which uses plain Bourne syntax. 2. PATH is defined in /etc/environment and includes ~/.guix-profile/bin. /etc/environment is defined by pam_env to be a simple KEY=VAL file, with no support for varibales substitute. If we do not use pam_env (linux specified?), I think we should let /etc/zlogin source /etc/profile instead. Yes, but they would contain almost the same lines, right? To what extent is zsh Bourne- or Bash-compatible? Does ‘export foo=bar’ work for zsh? It does. If it does, let’s just keep /etc/profile, and use it for both zsh and Bash. And we don't want /etc/zlogin when not using zsh at all, IIUC while skeletons is configurable at the top os-expr, /etc/zlogin is not. It’s OK to have a 2-KiB /etc/zlogin, even when one doesn’t use zsh. 3. The skeleton for ~/.bash_profile sources /etc/profile, /etc/bashrc, and ~/.bashrc. 4. The definition of PS1 is moved from /etc/profile to /etc/bashrc. 5. The skeleton for ~/.bashrc sources /etc/bashrc. It seem too much, what I suggested is: for login, su (pam_env): /etc/environment for login shell: ~/.bash_profile, ~/.zlogin for interactive: ~/.bashrc, ~/.zshrc skeletons only installed when needed :) As a first step, what about always installing the skeletons? Then we can see whether/how to refine that. No problem. Thanks, Ludo’. And this is what I have so far: From 1e400957b29a47f63548df39b36a7c0f1d8a37d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= iyzs...@gmail.com Date: Tue, 2 Dec 2014 21:40:52 +0800 Subject: [PATCH] gnu: Add /etc/environment. * gnu/system.scm (default-/etc/environment): New procedure. (etc-directory)[profile]: Remove it. (etc-directory)[environment]: Add it. * gnu/system/linux.scm (unix-pam-service): Add #:readenv? parameter. * gnu/services/base.scm (mingetty-service): Pass #t as #:readenv? to unix-pam-service. * gnu/system/shadow.scm (default-skeletons): Add .bash_profile. Adjust .bashrc. --- gnu/services/base.scm | 3 ++- gnu/system.scm| 40 gnu/system/linux.scm | 26 -- gnu/system/shadow.scm | 18 +++--- 4 files changed, 53 insertions(+), 34 deletions(-) diff --git a/gnu/services/base.scm b/gnu/services/base.scm index 71b..b8dedd7 100644 --- a/gnu/services/base.scm +++ b/gnu/services/base.scm @@ -372,7 +372,8 @@ the ``message of the day''. ;; duplicates are removed. (list (unix-pam-service login #:allow-empty-passwords? allow-empty-passwords? - #:motd motd))) + #:motd motd + #:readenv? #t))) (define* (nscd-service #:key (glibc (canonical-package glibc))) Return a service that runs libc's name service cache daemon (nscd). diff --git a/gnu/system.scm b/gnu/system.scm index 731f9de..b0cf59f 100644 --- a/gnu/system.scm +++ b/gnu/system.scm @@ -351,6 +351,21 @@ This is the GNU system. Welcome.\n) Return the default /etc/hosts file. (text-file hosts (local-host-aliases host-name))) +(define* (default-/etc/environment #:key locale timezone) + Return the default /etc/environment file. + (let* ((profile /run/current-system/profile) + (path (string-join (list /run/setuid-programs + (string-append profile /bin) + (string-append profile /sbin)) +:))) +(text-file* environment \ +LANG= locale +TZ= timezone +TZDIR= tzdata /share/zoneinfo +LINUX_MODULE_DIRECTORY=/run/booted-system/kernel/lib/modules +PATH= path +INFOPATH=/run/current-system/profile/share/info\n))) + (define* (etc-directory #:key (locale C) (timezone Europe/Paris) (issue Hello!\n) @@ -375,25 +390,10 @@ This is the GNU system. Welcome.\n) (nsswitch (text-file nsswitch.conf hosts: files dns\n)) - ;; TODO: Generate bashrc from packages' search-paths. - (bashrc(text-file* bashrc -export PS1='\\u@\\h \\w\\$ ' - -export LC_ALL=\ locale \ -export TZ=\ timezone \ -export TZDIR=\ tzdata /share/zoneinfo\ - -# Tell 'modprobe' co. where to look for modules. -export LINUX_MODULE_DIRECTORY=/run/booted-system/kernel/lib/modules - -export PATH=$HOME/.guix-profile/bin:/run/current-system/profile/bin -export PATH=/run/setuid-programs:/run/current-system/profile/sbin:$PATH -export CPATH=$HOME/.guix-profile/include: profile /include -export LIBRARY_PATH=$HOME/.guix-profile/lib: profile /lib -export
Re: use zsh as login shell
宋文武 iyzs...@gmail.com skribis: Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: Ludovic Courtès l...@gnu.org writes: [...] So, instead of what you suggest, what about having: 1. /etc/profile and /etc/zlogin (?) both source /etc/environment, which uses plain Bourne syntax. 2. PATH is defined in /etc/environment and includes ~/.guix-profile/bin. /etc/environment is defined by pam_env to be a simple KEY=VAL file, with no support for varibales substitute. If we do not use pam_env (linux specified?), I think we should let /etc/zlogin source /etc/profile instead. Yes, but they would contain almost the same lines, right? To what extent is zsh Bourne- or Bash-compatible? Does ‘export foo=bar’ work for zsh? If it does, let’s just keep /etc/profile, and use it for both zsh and Bash. And we don't want /etc/zlogin when not using zsh at all, IIUC while skeletons is configurable at the top os-expr, /etc/zlogin is not. It’s OK to have a 2-KiB /etc/zlogin, even when one doesn’t use zsh. 3. The skeleton for ~/.bash_profile sources /etc/profile, /etc/bashrc, and ~/.bashrc. 4. The definition of PS1 is moved from /etc/profile to /etc/bashrc. 5. The skeleton for ~/.bashrc sources /etc/bashrc. It seem too much, what I suggested is: for login, su (pam_env): /etc/environment for login shell: ~/.bash_profile, ~/.zlogin for interactive: ~/.bashrc, ~/.zshrc skeletons only installed when needed :) As a first step, what about always installing the skeletons? Then we can see whether/how to refine that. Thanks, Ludo’.
Re: use zsh as login shell
Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: Currently, zsh doesn't work out of box. On the standalone system, right? Yes. IMO, we should use `/etc/environment' for system variables: LANG=en_US.UTF-8 PATH=/run/current-system/profile/bin:/run/setuid-programs And add `pam_env.so' to /etc/pam.d/login, to make tty login work. With `/etc/profile', `/etc/zlogin' just: source /etc/environment to make `bash -l' and `zsh -l' work. Is ‘pam env’ needed at all if /etc/profile and /etc/zlogin are provided anyway? Yes, it's redundant. Now I think the better way is just provide /etc/environment. then `bash -l' would take ~/.bash_profile and ~/.profile. We can have a default ~/.bash_profile like: source /etc/environment export PATH=$PATH:$HOME/.guix-profile/bin And install skeletons only when needed by using: (operating-system (skeletons (list bash-profile))) WDYT? And `~/.bash_profile', `~/.zlogin' for user variables: [[ $- == *i* ]] source ~/.bashrc # only for bash export PATH=$PATH:$HOME/.guix-profile/bin OK. It would be best to have $HOME/.guix-profile/bin in PATH installed by /etc/{profile,zlogin}, though, so that it works out of the box. Use `~/.bashrc', `~/.zshrc' for interactive settings: PS1='$ ' alias ls='ls -p --color' # $(guix package --search-paths)? OK. Thanks for the very good summary! I never had this clear an understanding of all this. In fact, I'm confused about this even now :) Would you like to submit a patch? The relevant parts are in (gnu system) for /etc/profile, in (gnu system shadow) for the .bashrc template, and in (gnu services base) for the PAM settings of the ‘login’ command. Sure, I'll try to write a patch, thanks for the direction. Ludo’.
Re: use zsh as login shell
Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: Currently, zsh doesn't work out of box. On the standalone system, right? Yes. IMO, we should use `/etc/environment' for system variables: LANG=en_US.UTF-8 PATH=/run/current-system/profile/bin:/run/setuid-programs And add `pam_env.so' to /etc/pam.d/login, to make tty login work. With `/etc/profile', `/etc/zlogin' just: source /etc/environment to make `bash -l' and `zsh -l' work. Is ‘pam env’ needed at all if /etc/profile and /etc/zlogin are provided anyway? Yes, it's redundant. Now I think the better way is just provide /etc/environment. then `bash -l' would take ~/.bash_profile and ~/.profile. We can have a default ~/.bash_profile like: source /etc/environment export PATH=$PATH:$HOME/.guix-profile/bin And install skeletons only when needed by using: (operating-system (skeletons (list bash-profile))) WDYT? And `~/.bash_profile', `~/.zlogin' for user variables: [[ $- == *i* ]] source ~/.bashrc # only for bash export PATH=$PATH:$HOME/.guix-profile/bin OK. It would be best to have $HOME/.guix-profile/bin in PATH installed by /etc/{profile,zlogin}, though, so that it works out of the box. Use `~/.bashrc', `~/.zshrc' for interactive settings: PS1='$ ' alias ls='ls -p --color' # $(guix package --search-paths)? OK. Thanks for the very good summary! I never had this clear an understanding of all this. In fact, I'm confused about this even now :) Would you like to submit a patch? The relevant parts are in (gnu system) for /etc/profile, in (gnu system shadow) for the .bashrc template, and in (gnu services base) for the PAM settings of the ‘login’ command. Sure, I'll try to write a patch, thanks for the direction. Ludo’.
Re: use zsh as login shell
宋文武 iyzs...@gmail.com skribis: Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: [...] IMO, we should use `/etc/environment' for system variables: LANG=en_US.UTF-8 PATH=/run/current-system/profile/bin:/run/setuid-programs And add `pam_env.so' to /etc/pam.d/login, to make tty login work. With `/etc/profile', `/etc/zlogin' just: source /etc/environment to make `bash -l' and `zsh -l' work. Is ‘pam env’ needed at all if /etc/profile and /etc/zlogin are provided anyway? Yes, it's redundant. Now I think the better way is just provide /etc/environment. then `bash -l' would take ~/.bash_profile and ~/.profile. We can have a default ~/.bash_profile like: source /etc/environment export PATH=$PATH:$HOME/.guix-profile/bin Currently, the .bashrc skeleton sources /etc/profile. So, instead of what you suggest, what about having: 1. /etc/profile and /etc/zlogin (?) both source /etc/environment, which uses plain Bourne syntax. 2. PATH is defined in /etc/environment and includes ~/.guix-profile/bin. 3. The skeleton for ~/.bash_profile sources /etc/profile, /etc/bashrc, and ~/.bashrc. 4. The definition of PS1 is moved from /etc/profile to /etc/bashrc. 5. The skeleton for ~/.bashrc sources /etc/bashrc. ? (I was reading the Bash manual to make sure (info (bash) Bash Startup Files), and as an exercise, I’ve cleaned up my own ~/.bashrc and ~/.bash_profile accordingly, which fixes the issue I reported a couple of weeks ago regarding ‘guix environment’.) Thanks, Ludo’.
Re: use zsh as login shell
Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: Ludovic Courtès l...@gnu.org writes: 宋文武 iyzs...@gmail.com skribis: [...] IMO, we should use `/etc/environment' for system variables: LANG=en_US.UTF-8 PATH=/run/current-system/profile/bin:/run/setuid-programs And add `pam_env.so' to /etc/pam.d/login, to make tty login work. With `/etc/profile', `/etc/zlogin' just: source /etc/environment to make `bash -l' and `zsh -l' work. Is ‘pam env’ needed at all if /etc/profile and /etc/zlogin are provided anyway? Yes, it's redundant. Now I think the better way is just provide /etc/environment. then `bash -l' would take ~/.bash_profile and ~/.profile. We can have a default ~/.bash_profile like: source /etc/environment export PATH=$PATH:$HOME/.guix-profile/bin Currently, the .bashrc skeleton sources /etc/profile. So, instead of what you suggest, what about having: 1. /etc/profile and /etc/zlogin (?) both source /etc/environment, which uses plain Bourne syntax. 2. PATH is defined in /etc/environment and includes ~/.guix-profile/bin. /etc/environment is defined by pam_env to be a simple KEY=VAL file, with no support for varibales substitute. If we do not use pam_env (linux specified?), I think we should let /etc/zlogin source /etc/profile instead. And we don't want /etc/zlogin when not using zsh at all, IIUC while skeletons is configurable at the top os-expr, /etc/zlogin is not. 3. The skeleton for ~/.bash_profile sources /etc/profile, /etc/bashrc, and ~/.bashrc. 4. The definition of PS1 is moved from /etc/profile to /etc/bashrc. 5. The skeleton for ~/.bashrc sources /etc/bashrc. It seem too much, what I suggested is: for login, su (pam_env): /etc/environment for login shell: ~/.bash_profile, ~/.zlogin for interactive: ~/.bashrc, ~/.zshrc skeletons only installed when needed :) ? (I was reading the Bash manual to make sure (info (bash) Bash Startup Files), and as an exercise, I’ve cleaned up my own ~/.bashrc and ~/.bash_profile accordingly, which fixes the issue I reported a couple of weeks ago regarding ‘guix environment’.) Thanks, Ludo’.
use zsh as login shell
Currently, zsh doesn't work out of box. IMO, we should use `/etc/environment' for system variables: LANG=en_US.UTF-8 PATH=/run/current-system/profile/bin:/run/setuid-programs And add `pam_env.so' to /etc/pam.d/login, to make tty login work. With `/etc/profile', `/etc/zlogin' just: source /etc/environment to make `bash -l' and `zsh -l' work. And `~/.bash_profile', `~/.zlogin' for user variables: [[ $- == *i* ]] source ~/.bashrc # only for bash export PATH=$PATH:$HOME/.guix-profile/bin Use `~/.bashrc', `~/.zshrc' for interactive settings: PS1='$ ' alias ls='ls -p --color' # $(guix package --search-paths)? Note: non-login interactive should inherit env from parent, eg: `env -i $(which bash)' spawn a shell with no PATH (what I expect).
Re: use zsh as login shell
宋文武 iyzs...@gmail.com skribis: Currently, zsh doesn't work out of box. On the standalone system, right? IMO, we should use `/etc/environment' for system variables: LANG=en_US.UTF-8 PATH=/run/current-system/profile/bin:/run/setuid-programs And add `pam_env.so' to /etc/pam.d/login, to make tty login work. With `/etc/profile', `/etc/zlogin' just: source /etc/environment to make `bash -l' and `zsh -l' work. Is ‘pam env’ needed at all if /etc/profile and /etc/zlogin are provided anyway? And `~/.bash_profile', `~/.zlogin' for user variables: [[ $- == *i* ]] source ~/.bashrc # only for bash export PATH=$PATH:$HOME/.guix-profile/bin OK. It would be best to have $HOME/.guix-profile/bin in PATH installed by /etc/{profile,zlogin}, though, so that it works out of the box. Use `~/.bashrc', `~/.zshrc' for interactive settings: PS1='$ ' alias ls='ls -p --color' # $(guix package --search-paths)? OK. Thanks for the very good summary! I never had this clear an understanding of all this. Would you like to submit a patch? The relevant parts are in (gnu system) for /etc/profile, in (gnu system shadow) for the .bashrc template, and in (gnu services base) for the PAM settings of the ‘login’ command. Ludo’.