[Semibug] Crazy unix shell prompts

Andrew Ruscica andrew at ruscica.com
Thu Dec 29 15:54:27 EST 2022


Thanks for posting this Nick!
I've been wanting to enhance my prompts and this is just what I needed..

On Wed, Dec 28, 2022 at 11:10 PM Nick Holland <nick at holland-consulting.net>
wrote:

> I tripped across an idea recently which I'm not sure if
> it is brilliant or evil.  But I kinda like it.
>
> Standard unix shell prompt is a $ or # (or a number of
> other things, if you like unusual shells).  Every operating
> system I've used in the last 40 years has some kind of
> prompt...but that's not exactly a requirement.  And most of
> us start cramming other info into the prompt, for example,
> my standard prompt has grown to three lines -- a blank line,
> username at hostname, then the full path and the $ or #.
>
>     <this line intentionally left blank for spacing>
> nick at dbu1.in.nickh.org
> /bu/hc1/2022-12-24/archive #
>
> (and yes, I get it, a lot of people think my multi-line
> command prompts are evil enough already.  If you are in
> that camp, you might want to stop reading, or even better,
> delete this message now before going on.)
>
> (you were warned)
>
> The suggestion was...put a newline at the end of your PS1
> prompt, so that when you copy and paste to re-run a command
> (or run it in another window), you don't have to un-select
> the $ or # (and everything else you put in).
>
> Huh.  So a command line might look like this:
>
> nick at dbu1.in.nickh.org /bu/hc1/2022-12-24/archive #
> <type your command here>
>
> Well, I don't recall if the rest was in the original source
> of the message or if I came up with the rest myself...
>
> Make the first character of the prompt line a #, so when
> you copy and paste, the username and stuff is a comment.
> But then you have to do the same for the PS2 (continuation
> prompt).  Ok, so I did.  But I didn't like having a "#" at
> the beginning of every command line, because that makes it
> look like I'm running as root...so (whoa. slippery slope
> here) use a few color changes to make the "#" the
> terminal background color.  Ok, so now I have a multi-line
> multi-color PS1 with nothing in front of the command I'm
> typing.  I warned you.
>
> So now, I have something like this:
>   export PS1='\n'$(tput setf 7)#$(tput setf 0)'\$\$\$ \u @ \h \w \$\n'
>   export PS2="$(tput setf 7)#$(tput setf 0)>\n"
>
> So now, if I cobble together a few lines that I might wish
> to run again via copy/paste or even put into a shell script,
> it might look like this:
>
>      #$$$ nick @ hc1 ~ $
>      PS3="Pick a motorcycle -> "
>
>      #$$$ nick @ hc1 ~ $
>      select M in FLTC K1200LT K100RT BuellBlast; do
>      #>
>      echo $M
>      #>
>      done
>      1) FLTC
>      2) K1200LT
>      3) K100RT
>      4) BuellBlast
>      Pick a motorcycle -> 3
>      K100RT
>      Pick a motorcycle -> ^C
>
>      #$$$ nick @ hc1 ~ $
>
> except...the leading "#" are mostly greyed out and ALMOST
> indistinguishable from the background.
>
> And now, if I want to re-run this, I can copy and paste the
> entire block -- including the prompt lines! -- again and re-run
> it or run it somewhere else, or even copy and paste into a
> script, then just delete out the prompt lines (dd is quicker than
> moving to the right spot and deleting characters)
>
> Oh, btw.  the ksh/bash "select" command is way cool. But that's
> a different topic.  I just stuck it in here because, well, I could.
>
> Explanation of the prompt commands:
>   export PS1='\n'$(tput setf 7)#$(tput setf 0)'\$\$\$ \u @ \h \w \$\n'
>   export PS2="$(tput setf 7)#$(tput setf 0)>\n"
>
> "export" because we want this variable to impact everything
> invoked by this shell, not just this shell.
> PS1 is the default "Enter your command here" prompt.
>     '\n' -- literal newline
>     $(tput setf 7) -- set the font color to 7 (grey, on my white
> background)
>        (execute the tput command with those options, embeds an esc
> sequence)
>     #  -- make this line a "comment" if copied and pasted and re-run (but
> grey!)
>     $(tput setf 0) -- set font color back to 0 (black)
>     '\$\$\$' -- either $ for normal user or # for root.  Repeated because,
> well,
>         I don't want to take that # as a "you are running as root" here.
>     \u -- username
>     @ -- literal @ symbol.  Spaces around it because I don't want it look
> like e-mail.
>     \n -- hostname
>     \w -- working directory
>     \$ -- because the three earlier $ or # weren't enough.
>
> PS2 is the continuation prompt, and PS3 is the prompt used by select.
> Some things are surrounded by single quotes to keep them unexpanded,
> other things like the PS2, are expanded and stored as escape sequences
> rather than running tput every time a PS2 prompt is displayed.
>
> Enjoy. Or don't.  Honestly, I'm not sure if I like this yet, but I
> think I do.  Figured I'd share this idea...
>
> Tested on OpenBSD ksh (pdksh) and linux bash.
>
> Nick.
>
> _______________________________________________
> Semibug mailing list
> Semibug at lists.nycbug.org
> https://lists.nycbug.org:8443/mailman/listinfo/semibug
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.nycbug.org:8443/pipermail/semibug/attachments/20221229/06ceb8a1/attachment.htm>


More information about the Semibug mailing list