permacomputing

Source repository for the main permacomputing wiki site
git clone http://git.permacomputing.net/repos/permacomputing.git # read-only access
Log | Files | Refs

commit 6c77854960fd156317977d4e257c162cff35f2b2
parent d7bd99706263b7dc93fdb92cfebafda805850586
Author: spacehobo <spacehobo@web>
Date:   Fri, 15 May 2026 08:22:04 +0200

New, more dynamic version

Diffstat:
Mspacehobo.mdwn | 54++++++++++++++++++++++++++++++++++++------------------
1 file changed, 36 insertions(+), 18 deletions(-)

diff --git a/spacehobo.mdwn b/spacehobo.mdwn @@ -2,27 +2,45 @@ Hey, check out my neat `bash` prompt: - GIT_PS1_SHOWCOLORHINTS='y' - GIT_PS1_SHOWDIRTYSTATE='y' - GIT_PS1_SHOWSTASHSTATE='y' - GIT_PS1_SHOWUNTRACKEDFILES='y' - GIT_PS1_DESCRIBE_STYLE='contains' - GIT_PS1_SHOWUPSTREAM='auto' - - _noop[0]='array accesses turn 0/nonzero into defined/undef!' - PS1='\[\e[$(($?==0?1:5));$(($?==0?0:91))m\]\$\[\e[0m\] ' # $?-coloured $ - PS1='$(__git_ps1 "\[\e[1;33m\]{%s\[\e[1;33m\]}")'$PS1 # Gold git - PS1='\[\e[1;34m\]\w'$PS1 # Blue CWD - PS1='\[\e[1;33m\]:'$PS1 # Gold colon - PS1='\[\e[1;32m\]\h'$PS1 # Green hostname - PS1='\[\e[1;33m\]@'$PS1 # Gold at-sign - PS1='\[\e[1;35m\]\u'$PS1 # Purple username - PS1='\[\e[1;36m\]${debian_chroot:+($debian_chroot)}'$PS1 # Cyan chroot - PS1='${_noop[$((\j==0))]:+\[\e[1;33m\][\j]}'$PS1 # gold nonzero jobs - PS1='${_noop[$(($?==0))]:+\[\e[1;91m\]($?)}'$PS1 # Red nonzero $? +``` +GIT_PS1_SHOWCOLORHINTS='y' +GIT_PS1_SHOWDIRTYSTATE='y' +GIT_PS1_SHOWSTASHSTATE='y' +GIT_PS1_SHOWUNTRACKEDFILES='y' +GIT_PS1_DESCRIBE_STYLE='contains' +GIT_PS1_SHOWUPSTREAM='auto' + +_noop[0]='array accesses turn 0/nonzero into defined/undef!' +declare -A _session +_session["tty"]='array accesses turn tty/* into defined/undef!' +PS1='\[\e[$(($?==0?1:5));$(($?==0?0:91))m\]\$\[\e[0m\] ' # $?-coloured $ +PS1='$(__git_ps1 "\[\e[1;33m\]{%s\[\e[1;33m\]}")'$PS1 # Gold git +PS1='\[\e[1;34m\]\w'$PS1 # Blue CWD +PS1='${SSH_CONNECTION:+\[\e[1;32m\]\h\[\e[1;33m\]:}'$PS1 # Green hostname, gold : +PS1='${_session[$XDG_SESSION_TYPE]:+\[\e[1;35m\]\u${SUDO_USER:+\[\e[1;91m\]($SUDO_USER)}\[\e[1;33m\]@}'$PS1 # Purple username +PS1='${debian_chroot:+\[\e[1;36m\]($debian_chroot)}'$PS1 # Cyan chroot +PS1='${_noop[$((\j==0))]:+\[\e[1;33m\][\j]}'$PS1 # gold nonzero jobs +PS1='${_noop[$(($?==0))]:+\[\e[1;91m\]($?)}'$PS1 # Red nonzero $? +``` The prompt environment is fairly limited. It can do parameter expansion, reference expansion, arithmetic expansion, and a couple other neat tricks. You can shell out, but if you do that overwrites the variable that contains the exit code of the last program you ran (`$?`). Tools such as the `__git_ps1` hacks do their best to only use features of bash that work internally to bash itself. This prompt uses the `_noop` array (with only `${_noop[0]}` defined) to turn arithmetic expressions into defined/undefined responses. This lets us use some of the brace-expansion features to specify alternate output, so we can display the error code or number of jobs in the background *only* if they're non-zero, and we can style them with a high degree of freedom. +It does a similar trick with a string-indexed associative array, and only displays the hostname if the `$XDG_SESSION_TYPE` is `"tty"` (which happens in `ssh` or `sudo` sessions). It dynamically displays the `$SUDO_USER` if that is available. + +What this means is that on your local desktop system, when you log in, your prompt is merely: + + ~$ + +But the same prompt on a remote system will show the more common: + + user@hostname:~$ + +And if you are in a chroot with background processes looking at a git repo after a command that exited with an error code of `1`: + + (1)[2](thechroot)user@hostname:~{main $%}$ + +with coloured styling information on all the various parts. + I just think it's neat!