home-bash-service default PS1 overwrites .bashrc PS1 in login shells

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Richard Sent
Owner
unassigned
Submitted by
Richard Sent
Severity
normal
R
R
Richard Sent wrote on 3 Apr 17:52 +0200
(address . bug-guix@gnu.org)
87r0fmmoj4.fsf@freakingpenguin.com
Hi Guix!

A common convention for where to set PS1 is in .bashrc, not
.bash_profile [1-3]. Unfortunately home-bash-service doesn't support this
convention for login shells.

home-bash-service generates a default .bash_profile that follows these
steps:

1. Source .profile
2. Source .bashrc
3. Set PS1 if guix-defaults? is truthy

This means that any PS1 configuration in .bashrc is overwritten by
.bash_profile for login shells specifically.

This is visible in a TTY, but also in WSL, which defaults to opening a
login shell. PS1 will be Guix's predefined value instead of the value
set in .bashrc.

Setting guix-defaults? to #f has many side effects, so I don't feel that
is a valid solution.

A comment in home/serivces/shells.scm suggests setting PS1 via
environment-variables since that is appended to the end of
.bash_profile. This is fine for simple prompts, but complicated prompts
are often split apart into separate bash functions and variables. Either
an implicit dependency between .bashrc and .bash_profile is created, or
.bash_profile balloons into a mega-file while the conventional wisdom is
to keep it as simple as possible.

environment-variables also exports PS1, causing it to become an
environment variable, not a shell variable. This might cause some odd
behavior when subprocesses inherit it. [4]

Some possible solutions:

1. Move default PS1 to bashrc, right after serializing %default-bashrc
2. Keep default PS1 in .bash_profile, but before loading .bashrc
3. Add a set-prompt? field to home-bash-configuration

Of the 3, I think 1 is the best and plan to submit a patch for it soon.
I'm opening the bug in case anyone thinks I missed something.


--
Take it easy,
Richard Sent
Making my computer weirder one commit at a time.
L
L
Ludovic Courtès wrote on 29 Apr 23:53 +0200
Re: [bug#70205] [PATCH] home: services: bash: Move default PS1 prompt to bashrc
(name . Richard Sent)(address . richard@freakingpenguin.com)
87mspbzvgt.fsf@gnu.org
Hi Richard,

Richard Sent <richard@freakingpenguin.com> skribis:

Toggle quote (7 lines)
>
> * home/services/shells.scm (add-bash-configuration): Move default PS1 prompt
> from .bash_profile to .bashrc.
>
> Change-Id: Ic437458ee362cc4aa803a71c9962af866749f59a

Sounds reasonable to me; thanks for the clear explanation in

There was one missing newline before aliases so I made the following
change (adding two newlines, for good measure).

Applied, thanks!

Ludo’.
Toggle diff (18 lines)
diff --git a/gnu/home/services/shells.scm b/gnu/home/services/shells.scm
index a5b2586dde..ee6b09f17c 100644
--- a/gnu/home/services/shells.scm
+++ b/gnu/home/services/shells.scm
@@ -421,11 +421,11 @@ (define (add-bash-configuration config)
,@(list (file-if-not-empty
'bashrc
(if (home-bash-configuration-guix-defaults? config)
- (list (plain-file-content %default-bashrc)
+ (list (plain-file-content %default-bashrc) "\n"
;; The host distro might provide a bad 'PS1'
;; default--e.g., not taking $GUIX_ENVIRONMENT into
;; account. Provide a good default here when asked.
- "PS1='\\u@\\h \\w${GUIX_ENVIRONMENT:+ [env]}\\$ '"
+ "PS1='\\u@\\h \\w${GUIX_ENVIRONMENT:+ [env]}\\$ '\n"
(serialize-field 'aliases))
(list (serialize-field 'aliases))))
(file-if-not-empty 'bash-logout)))))
Closed
?
Your comment

This issue is archived.

To comment on this conversation send an email to 70164@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 70164
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch