this post was submitted on 22 Mar 2025
67 points (92.4% liked)

Linux

52274 readers
620 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by AlpΓ‘r-Etele MΓ©der, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
67
Share your Bash prompts! (sh.itjust.works)
submitted 2 days ago* (last edited 2 days ago) by Kalcifer@sh.itjust.works to c/linux@lemmy.ml
 

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

  1. 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.

Crossposts:

top 41 comments
sorted by: hot top controversial new old
[–] MadMadBunny@lemmy.ca 48 points 2 days ago* (last edited 2 days ago) (2 children)
[–] Kalcifer@sh.itjust.works 12 points 2 days ago

HA, that's so cursed. I love it.

[–] hallettj@leminal.space 5 points 2 days ago

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

[–] hallettj@leminal.space 25 points 2 days ago (4 children)
[–] Ephera@lemmy.ml 15 points 2 days ago (1 children)

Same. I guess, this is the Starship thread now. My config:

collapsed inline media

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.)

[–] fluckx@lemmy.world 3 points 1 day ago

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!

[–] billwashere@lemmy.world 1 points 1 day ago

Yeah I’m gonna check this out at work next week for sure.

[–] tankplanker@lemmy.world 1 points 1 day ago

collapsed inline media

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

[–] mbirth@lemmy.ml 16 points 1 day ago (3 children)

I’m using fish and the default is enough for anybody. 😁

[–] Azzk1kr@feddit.nl 4 points 1 day ago (1 children)

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).

[–] mbirth@lemmy.ml 2 points 1 day ago (1 children)

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?

[–] crmsnbleyd@sopuli.xyz 4 points 1 day ago

I love it! You get git and virtual env integration for free :)

[–] PlutoniumAcid@lemmy.world 0 points 1 day ago (1 children)

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.

[–] mbirth@lemmy.ml 8 points 1 day ago

You shouldn’t just β€œdrop bash commands into it” anyways. And if you really need it, bash is only one bash away.

[–] djehuti@programming.dev 10 points 1 day ago

$ or # , depending on whether I'm root.

[–] Xanza@lemm.ee 9 points 2 days ago (1 children)
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\]\\$ "
[–] ikidd@lemmy.world 3 points 2 days ago (1 children)
[–] PlutoniumAcid@lemmy.world 4 points 1 day ago (1 children)

How so? What does this do?

[–] billwashere@lemmy.world 2 points 1 day ago

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.

[–] golden_zealot@lemmy.ml 9 points 2 days ago

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\]\$ '

collapsed inline media

[–] Rivalarrival@lemmy.today 6 points 1 day ago

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.

[–] mike_wooskey@lemmy.thewooskeys.com 6 points 2 days ago* (last edited 2 days ago) (1 children)

Mine shows the user and host, git commit and branch, docker context and directory, color coded based on status of git:

[root@server001|G:19e526e@(master)|D:myContext|currentDir] $

## PS1 adapted from https://gist.github.com/xenji/2292341
ps1_generator() {
    # docker context inspect --format '{{ .Name }}'
    Time12h="\T"; Time12a="\@"; ShortHost="\h"; Username="\u";
    PathShort="\W"; PathFull="\w"; NewLine="\n"; Jobs="\j";
    test -f ~/.config/git-prompt.sh || \
        curl -L https://raw.github.com/git/git/master/contrib/compl
etion/git-prompt.sh \
             > ~/.config/git-prompt.sh
    source ~/.config/git-prompt.sh
    Color_Off="\[\033[0m\]"; IBlack="\[\033[0;90m\]"; BWhite="\[\03
3[1;37m\]"; BGreen="\[\033[1;32m\]";
    BIRed="\[\033[1;91m\]"; BIWhite="\[\033[1;97m\]"; BIPurple="\[\
033[1;95m\]"; BIBlue="\[\033[1;94m\]";
    GIT_PS1='$(git branch &>/dev/null;\
if [ $? -eq 0 ]; then \
  echo "$(echo `git status` | \grep "nothing to commit" > /dev/null
 2>&1; \
  DIRTY="$?"; \
  HEADREV=`git log --pretty=%h -n 1`; \
  echo -n "|G:'${BWhite}'$HEADREV"; \
  if [ "$DIRTY" -eq "0" ]; then \
    # @4 - Clean repository - nothing to commit
    echo "@'${BGreen}'"$(__git_ps1 "(%s)"); \
  else \
    # @5 - Changes to working tree
    echo "'${BIBlue}'@'${BIRed}'"$(__git_ps1 "{%s}"); \
  fi)'${Color_Off}'"; \
else \
  # @2 - Prompt when not in GIT repo
  echo ""; \
fi)'
    if docker context inspect >/dev/null 2>&1; then
        DOCKER_PS1='|D:'${BIBlue}'$(docker context inspect --format
 "{{ .Name }}")'${Color_Off}
    fi
    USER_PS1=${BIPurple}${Username}'@'${ShortHost}${Color_Off}
    PATH_PS1='|'${BWhite}${PathShort}${Color_Off}
    export PS1='['${USER_PS1}${GIT_PS1}${DOCKER_PS1}${PATH_PS1}'] $
 '
}
ps1_generator && unset -f ps1_generator
[–] Goun@lemmy.ml 8 points 1 day ago (1 children)

Are you dowloading and sourcing a file from the internet on your prompt? That sounds a bit scary!

[–] mike_wooskey@lemmy.thewooskeys.com 4 points 1 day ago (1 children)

Well, yeah, but it's git: https://raw.github.com/git/git/master/contrib/completion/git-prompt.sh

My thinking is that I trust git on my computer, so I trust downloading from their repo.

But you're right. I should revisit this and see if it's even necessary.

[–] teawrecks@sopuli.xyz 2 points 1 day ago (2 children)

Is this running in your rc (i.e. every single time you open a terminal)? Even if it's safe, I'd be annoyed by any delay.

[–] Goun@lemmy.ml 2 points 1 day ago

Yeah, its checking if the file exists first, so it's not doing it all the time.

My worry is more related to repos takeovers or hacks. This is pretty hidden, so it could be easy to even forget it's there, probably not the worst, but still..

[–] mike_wooskey@lemmy.thewooskeys.com 1 points 1 day ago (1 children)

It is in my .bashrc, but any delay is not noticeable.

[–] teawrecks@sopuli.xyz 1 points 1 day ago

Ah that's fair, I didn't look closely

[–] nore@sh.itjust.works 5 points 1 day ago

Mine's pretty simple:

collapsed inline media

## .bashrc
export BLA=$(tput setaf 0) # Black
export RED=$(tput setaf 1) # Red
export GRE=$(tput setaf 2) # Green
export YEL=$(tput setaf 3) # Yellow
export BLU=$(tput setaf 4) # Blue
export MAG=$(tput setaf 5) # Magenta
export CYA=$(tput setaf 6) # Cyan
export WHI=$(tput setaf 7) # White

export BOL=$(tput bold)    # Bold
export ITA=$(tput sitm)    # Italic
export UL=$(tput smul)     # Underline
export NC=$(tput sgr0)     # No color & format

_branch() {
    local branch=$(__git_ps1 "%s")
    if [[ -z $branch ]]; then
        printf "${BLA}null${NC}"
    else 
        printf "${CYA}$branch"
    fi
}

PS1='.\[$(_pwd)\] \[$BLA\]γ€œ \[$MAG\]git\[$BLA\]:\[$(_branch)\] \n \[$NC$CYA\]\! \[$MAG\]\$ \[$NC\]'

## .inputrc

set vi-ins-mode-string \1\e[34m\2.INS
set vi-cmd-mode-string \1\e[33m\2.CMD
[–] wwwgem@lemmy.ml 5 points 2 days ago

Maybe you can find some inspiration here.

[–] catloaf@lemm.ee 4 points 2 days ago
export PS1="\[\e]0;\u@\h:\w\a\]\[\e[1;34m\]\u@\h:\w\[\e[0m\]\$ "

I am a simple man.

[–] DeuxChevaux@lemmy.world 4 points 2 days ago

Mine is simple (inspired by Kali Linux, if that's even correct)
PS1='\[\033[0;32m\]β”Œβ”€β”€[\t] (\u@\h)-[\w]\n└─$ \[\033[0m\]'

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\]'

collapsed inline media

I have a small issue with this prompt though. Sometimes the ❯ ends up turning white for some reason.

collapsed inline media

[–] z3rOR0ne@lemmy.ml 3 points 1 day ago* (last edited 1 day ago)

I use zsh, but my old Bash prompt looks almost the same as my Zsh prompt. Sorry, no screenshot, but here's the code:

export PS1='\[\033[01;34m\][\[\033[01;37m\] \W\[\033[01;34m\]]\$\033[01;34m\] $(git branch 2>/dev/null | grep '^*' | colrm 1 2)\n\033[01;34m└─>\033[37m '
[–] beirdobaggins@lemmy.world 2 points 8 hours ago

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$ '

collapsed inline media

[–] TheFadingOne@feddit.org 2 points 1 day ago* (last edited 1 day ago)

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='> '

collapsed inline media

[–] Termight@lemmy.ml 1 points 1 day ago

I like Liquid Prompt[1] (A useful adaptive prompt for Bash & Zsh) Examples:

ΞΈ70Β° 2z termight@zone51:~ $ vi .bashrc

ΞΈ71Β° 2z termight@zone51:~/docker/invidious master(+34/-17)* Β±

[1] https://github.com/liquidprompt/liquidprompt

[–] richardisaguy@lemmy.world 1 points 20 hours ago* (last edited 20 hours ago)

computer /usr/share/ $>

[–] SinkingLotus@lemmy.world 1 points 19 hours ago

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\] '

collapsed inline mediaimage

Note: The "$" prompt flashes like a typical cursor.