I’m looking for inspiration for a custom Bash prompt[1]. I’d love to see yours! 😊 If possible, include both the prompt’s PS1
, and a screenshot/example of what it looks like.
References
- Type: Documentation. Title: “Bash Reference Manual”. Publisher: Gnu Project. Edition: 5.2. Published: 2022-09-19. Accessed: 2025-03-21T02:46Z. URI: https://www.gnu.org/software/bash/manual/html_node/index.html.
- §6.9 “Controlling the Prompt”. URI: https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html.
Crossposts:
My shit is custom and rather elaborate.
From left-to-right:
- name@server-name
- Uptime (multiplied by 10 and rounded to the nearest integer to save space)
- Percentage disk space available on
/
- Number on established network connections
- Git branch
:
commit - Python virtualenv
- [new line]
- date and time
The code for this is on GitLab.
[username@host ~]$ >
Mine is just status(if not zero) and wd
Mine shows the full path and a new line for commands.
It will also print the exit code of the last command in red above the prompt, if the exit code is not 0.
PS1='$(ec=“$?”; if [ $ec -gt 0 ]; then echo -e “\n”[\e[91m]“exit code: $ec”[\e[0m]; fi)\n[\e[92m]\u[\e[38;5;213m]@[\e[38;5;39m]\h[\e[0m]:$PWD\n$ ’
C:\>
/s
Convert the PWD value to use backslashes, too, for extra cursedness.
c/FoundSatan
HA, that’s so cursed. I love it.
Do you have anything to check whether the current directory is under
/media/
or/mnt/
so that you can change the drive letter according to a deterministic assignment?/s
PS1='\[\e[1m\][\[\e[92m\]\u\[\e[0m\]@\[\e[96;1;3m\]\h\[\e[0;1m\]]\[\e[0m\] \[\e[1m\][\[\e[38;5;226m\]\w\[\e[39m\]]\[\e[0m\] \[\e[97;1m\]~\[\e[92;5m\]\$\[\e[0m\] '
Note: The “$” prompt flashes like a typical cursor.
$
or#
, depending on whether I’m root.computer /usr/share/ $>
I’m using fish and the default is enough for anybody. 😁
I love it! You get git and virtual env integration for free :)
Fish is a really great shell for daily use. There’s so much built in, its scripting language is better (not portable though if someone else does not have fish).
By now, enough people have fish that you can basically assume those scripts being “portable”. Far better than nushell or xonsh - which are both pretty advanced shells but other tools lack support for them, e.g. Midnight Commander.
Am I a loser if I stick to POSIX?
I recently started with fish and dislike that I can’t drop bash commands into it because it parses differently. That is enough to annoy me to uninstall.
You shouldn’t just “drop bash commands into it” anyways. And if you really need it, bash is only one
bash
away.
I use Starship
Same. I guess, this is the Starship thread now. My config:
I adapted it from the Gruvbox Rainbow theme.
I can post my config, if anyone wants specifically that. (It does kind of assume a light background, though.)I like the timer and the error icon on a fail. I can’t recall how often I think: damn this is taking too long. I should’ve timed the command
Starships looks very interesting! I’m going to check it out. Thanks!
Another starship user. Mostly want it to summarise useful stuff for folders pulled from git or whatever so it’s pretty plain rest of the time. I use the same on all my boxes
Yeah I’m gonna check this out at work next week for sure.
Prompt is pretty simple, mainly just adjusted coloring and added a timestamp.
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;36;01m\]\t \[\033[01;32m\]\u@\[\033[01;37;01m\]\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
My bash prompt is just me copying the prompt I have set on fish.
# Prompt green=$'\e[38;5;2m' bright_red=$'\e[38;5;9m' bright_green=$'\e[38;5;10m' reset=$'\e[0m' prompt_command() { local exit_status=$? if [[ $exit_status != 0 ]]; then exit_color=$bright_red exit_prompt=" [$exit_status]" else exit_color=$bright_green exit_prompt="" fi } PROMPT_COMMAND=prompt_command PS1='\[$green\]\w\[$exit_color\]$exit_prompt\n❯ \[$reset\]'
I have a small issue with this prompt though. Sometimes the ❯ ends up turning white for some reason.
I’m mainly using zsh but I have a backup bash prompt that closely mirrors it. It shows the return value of the previous command if it’s non-zero and gives some information about the current git repository if there is one.
retval() { if [ $? -eq 0 ]; then printf "" else printf "\001\e[31m\002($?)\001\e[0m\002" fi } gitbranch() { if type git 2> /dev/null 1> /dev/null && git rev-parse 2> /dev/null 1> /dev/null ; then MODIFIED="" if [[ -n $(git status --short) ]]; then MODIFIED=" M" fi BRANCH=$(git rev-parse --abbrev-ref HEAD) SHORTREF=$(git rev-parse --short HEAD) printf "\001\e[31m\002%s\001\e[0m\002(%s)\001\e[31m\002%s\001\e[0m\002" $BRANCH $SHORTREF $MODIFIED else echo -n "" fi } export PROMPT_DIRTRIM=3 PS1='$(retval)[\001\e[1;95m\002\u\001\e[0m\002@\h : \w $(gitbranch)] \$ ' PS2='> '
export PS1="\[\e[31m\][\[\e[m\]\[\e[38;5;172m\]\u\[\e[m\]@\[\e[38;5;153m\]\h\[\e[m\] \[\e[38;5;214m\]\W\[\e[m\]\[\e[31m\]]\[\e[m\]\\$ "
That’s a warcrime.
How so? What does this do?
Best I can tell is it’s a normal `username@hostname current_directory$ sorta prompt with some coloring: • Red for the square brackets • Orange (color 172) for the username • Light blue (color 153) for the hostname • Amber (color 214) for the current working directory
Other than being hard to read from the embedded coloring I’m not sure why this is a war crime.
I didn’t even know I needed to edit my prompt, but now I don’t know how I have lived with it for so long.