Bash Prompts Collection

(gilesorr.com)

66 points | by giulianopz 7 days ago ago

32 comments

  • kragen 3 days ago ago

    I strongly recommend against putting a ">" in your prompt on Unix if you're using any kind of system that supports copy and paste. (So, like, on a physical VT100 on a serial port it would be okay.) Sooner or later you're going to take a prompt-included command like

        > ls GN*
    
    and accidentally paste it into a terminal window (or a web page that someone else pastes into a terminal window) and accidentally create an empty file named "ls". Or, in some cases, overwrite an existing file.

    My own current setting is

        PS1=': ${env:+($env) }\W; '
    
    Which looks like this:

        : ~; cd wak
        : wak; ls
        LICENSE   monosrc    scripts  toybox            toybox_awk_test
        Makefile  README.md  src      toybox_awk_parts
        : wak; 
    
    The :; has the advantage that, if you unintentionally include the prompt in your copy and paste, it usually has no effect. (Maybe I should change ($env) to [$env].) \W (the last segment of the directory name) is usually about the right amount of context for me, but if I were working on a project with a lot of directories named things like "views" I would probably reconsider that.

    BTW, since this prompt collection was written, Linux terminal emulators have mostly gained 24-bit color support, which potentially opens up more alternative colors. See http://canonical.org/~kragen/sw/dev3/gradient.c with sample results in http://canonical.org/~kragen/sw/dev3/gradient.png. The escape sequence is \033[38;2;rrr;ggg;bbbm, where \033 is ESC and rrr, ggg, and bbb are decimal numbers from 0 to 255.

    (Probably I should switch from bash to zsh...)

    • oneshtein 3 days ago ago

      I use Linux for 30 years. Never had this problem. However, I saw newbies, which copy paste commands from tutorials to shell and then frustrated, because # is a comment.

      • kragen 3 days ago ago

        I bet you've never accidentally rm -rf'ed your home directory or your email archives either.

        • AdieuToLogic 2 days ago ago

          > I bet you've never accidentally rm -rf'ed your home directory or your email archives either.

          If this is a concern to mitigate, consider adding the following alias to your preferred shell profile:

            alias rm='/bin/rm -I'
          
          This will not conflict with scripts using PATH-relative 'rm' invocations, yet will provide the desired protection from erroneous interactive use of "rm -rf".

          See here[0] for details regarding the '-I' flag.

          0 - https://linux.die.net/man/1/rm

          • kragen 20 hours ago ago

            This would have helped when I `rm -rf`ed my home directory, but I was on Ultrix, whose `rm` didn't have the `-I` flag. In fact, I don't think even GNU `rm` had `-I` yet. I was in /tmp/something where I'd unpacked some software package I'd downloaded and decided was of no use, and I wanted to read netnews, so I typed

                rm -rf * & cd; trn
            
            Several hours later, around 3 AM, I was done reading netnews, so I exited trn. Then I remembered that there was one newsgroup I had forgotten to read, so I typed ↑↵ to run trn again, which had the effect of again running

                rm -rf * & cd; trn
            
            but this time in my home directory. And of course my frantic ^C^C^C had no effect on the `rm`, which was safely in the background.

            Fortunately the computer center kept nightly backups.

          • porridgeraisin 2 days ago ago

            I alias rm='rm -i', and then check that I'm deleting the right thing. And then redo the command with `yes | rm -r whatever`. This ends up giving me an "audit log" of what was deleted.

        • nailer 2 days ago ago

          I do

          rm /dir

          Then go back and add the -rf.

          Works on GNU and BSD. On GNU only you can

          ‘rm /dir -rf’

    • AdieuToLogic 2 days ago ago

      > I strongly recommend against putting a ">" in your prompt on Unix ...

      Another reason against using ">" in the definition of PS1 is that this is a typical character used in the definition of PS2[0].

      > The :; has the advantage that, if you unintentionally include the prompt in your copy and paste, it usually has no effect.

      This is because colon (':') has a specific definition in POSIX shells[1], which is:

        Do nothing beyond expanding arguments and performing 
        redirections. The return status is zero.
      
      Note that "performing redirections" can result in destructive file operations.

      0 - https://unix.stackexchange.com/questions/193659/in-which-sit...

      1 - https://www.gnu.org/software/bash/manual/html_node/Bourne-Sh...

      • kragen 19 hours ago ago

        Right, I shouldn't assume that everyone knows what the `:` command does. I'm not especially worried about destructive file operations in this context because I don't think any of my directories has a `>` in its filename.

    • chickensong 3 days ago ago

      You can avoid this by using Unicode character U+276F "Heavy Right-Pointing Angle Quotation Mark Ornament", which also looks better IMHO.

  • nailer 3 days ago ago

    I find it’s very valuable to have a time Delta in the prompt. Knowing how long something normally takes can help you catch situations where your five second test run turns into a 30 second test run very easily.

  • latchkey 3 days ago ago

    Adopted:

      https://atuin.sh/
      https://github.com/akinomyoga/ble.sh
      https://starship.rs/
    
    These three have made my shell game so much more enjoyable.
    • jiehong 3 days ago ago

      Can’t agree more.

      atuin in particular records the history of each command but also how long they took and is they were successful or not.

      You never have to rerun a command with long output to know how long it took: just ctrl-r and see.

  • okasaki 3 days ago ago

    Like most customization and command replacements (like the fancy greps, ls's, etc), I've stopped using fancy prompts because I log in to lots of systems over the day and most of them won't have my prompt and this causes annoyance.

    Also I have a theory that it lowers chatbot performance if you're copy pasting terminal output.

    • dpflan 3 days ago ago

      I feel you, though this is why it's quite useful to have your own repo (or even just a dot file you can scp) with your dots files in them so you can "move in" to any machine and feel at home. Just clone/scp, then run your move in script.

      This also applies to say vimrc (choose your editor/tool of choice).

    • r_lee 3 days ago ago

      About that last part, what do you mean exactly?

      One thing that comes to mind is it might make its output more aligned with data that includes the full terminal output, which could make it more copy-pastey?

      • okasaki 3 days ago ago

        I mean that chatbots might have an easier time working with terminal output with the standard prompt rather than one that has your battery, weather, git branch and aws account in it.

        It's just an idle thought though.

        • actionfromafar 3 days ago ago

          Seems perfectly reasonable. Everything unrelated is an opportunity to go off the rails.

  • everybodyknows 3 days ago ago

    Missing from all of these: Error code returned from previous command. Invaluable.

    • PeterWhittaker 3 days ago ago

      Absolutely! Not only does filtering on $? provide info (last command interrupted, suspended, good, bad, etc.), it makes the prompt itself a quick way to test [[ ... ]] expressions....

      (My prompt is platform aware since codes for some ops differ between MacOS and Linux. The return is colour-coded (green, red, purple, depending on case), and multiline, with git status if in a repo, cwd, and a few other things....)

    • crtasm 2 days ago ago

      Dan's Prompt includes the exit code

  • grepfru_it 3 days ago ago

    My buddy spike723 on EFnet built what I can only describe as a sentinent bash prompt. I recall it being massive and could show you everything about your system in a prompt.

    25 years later I have no clue where this guy went but I remember him because he was instrumental in moving me off zsh to bash

    • dpflan 3 days ago ago

      Right on, I've always enjoyed tinkering with my own `$PS1`. Why did you move from zsh to bash -- what bash features pulled you over?

      • grepfru_it 3 days ago ago

        This was 20 years ago, but what I found was that bash is on every system. Too many shells would only have bash (or ksh) where my zsh profiles were useless. Fast forward to today and I’m hard pressed to find any containers with anything but Bourne. So bash it is!

        • dpflan 2 days ago ago

          Understood. I learned this way too, stick with a near universal standard/expectation, especially if you want to script for it and customize and if you are accessing remote machines often so you can be comfortable and productive in any situation.

          P.S. just fully noticed your handle, very shell discussion appropriate! :)

  • procaryote 3 days ago ago

    I was a bit surprised only one of them included showing if the last command succeeded or not. My $ being green if ok red otherwise is one of the few things I miss when using a stock prompt.

    For bash users I can recommend looking into setting PS1 from a function and assigning that function to PROMPT_COMMAND as it makes it much easier to make it readable

  • 3 days ago ago
    [deleted]
  • phyzome 3 days ago ago

    Now this is prompt engineering.

  • 1oooqooq 2 days ago ago

    you can spot a journey man by the lack of last command exit code on the bash prompt.

  • cstrahan 3 days ago ago

    Another idea: an indication of how many background jobs are currently running. With many terminal tabs open, I can forget if I already have $EDITOR (or something else) running, so the number of jobs can be a nice cue.

        _jobscount() {
            local jobs=($(jobs -p))
            local count=${#jobs[@]}
            (($count)) && echo -n " (${count}j)"
        }
    
    And then put that in your prompt.
  • sixthDot 3 days ago ago

    ty giles

  • 3 days ago ago
    [deleted]