On 12/9/2017 1:28 PM, Bryan Steele wrote: > On Sat, Dec 09, 2017 at 06:44:44PM +0100, Theo Buehler wrote: >> This was discussed in a smaller circle and has been in snaps for two >> days, but I'd like to show this to a wider audience. >> >> Theo asked me to make sure that all our shells print a prompt including >> the hostname by default. The reasoning is roughly as follows: >> >> With tmux, ssh and vmd, we tend to open shells on many different hosts >> simultaneously and the default prompts '$ ' and '# ' for {,k}sh as well >> as '% ' and '# ' for csh become dangerous: it's very easy to issue a >> command on the wrong host. >> >> This can easily be avoided by displaying the hostname in the prompt. >> Everything beyond "hostname{$,#,%} " is going to be a matter of taste, >> so we left it at that. If you use an FQDN, only the first part (the >> output of 'hostname -s') will be printed. >> >> Since not everybody makes use of the config files in /etc/skel or runs >> only login shells, it is not really possible to handle this with config >> files. Thus, we decided to hardcode it in the shells. We are aware that >> POSIX says that PS1 defaults to '$ ' or '# ' for sh(1). >> >> The simplest case is ksh: rely on the already existing shell escapes. >> For sh we can easily fall back to these (the diff to ksh/lex.c). For >> csh, I decided to implement the "%m" prompt escape which is standard in >> c-type shells, so I don't expect this to cause surprises. >> >> In single user mode and the early installer, gethostname() returns the >> empty string, so the familiar prompts will be displayed there. > I think we should go ahead with this for the reasons mentioned, the > default configuration should make things easier for the people using it, > which means developers doing release builds, spinning up vms, etc. > > People can go on and on about standards compliance, but if it means > someone is less likely to reboot the wrong machine, or worse, then > POSIX be damned. > > ok brynet@
I'm with brynet@ and the others on this. Was a nice surprise when I installed a new snap last night, already proved itself to be useful. ok bcallah@, fwiw >> Index: bin/csh/const.c >> =================================================================== >> RCS file: /var/cvs/src/bin/csh/const.c,v >> retrieving revision 1.8 >> diff -u -p -r1.8 const.c >> --- bin/csh/const.c 26 Oct 2015 16:27:04 -0000 1.8 >> +++ bin/csh/const.c 8 Dec 2017 12:15:26 -0000 >> @@ -114,6 +114,8 @@ Char STRprintexitvalue[] = { 'p', 'r', ' >> 'a', 'l', 'u', 'e', '\0' }; >> Char STRprompt[] = { 'p', 'r', 'o', 'm', 'p', 't', '\0' }; >> Char STRprompt2[] = { 'p', 'r', 'o', 'm', 'p', 't', '2', '\0' }; >> +Char STRpromptroot[] = { '%', 'm', '#', ' ', '\0' }; >> +Char STRpromptuser[] = { '%', 'm', '%', ' ', '\0' }; >> Char STRpushdsilent[] = { 'p', 'u', 's', 'h', 'd', 's', 'i', 'l', >> 'e', 'n', >> 't', '\0' }; >> Char STRret[] = { '\n', '\0' }; >> @@ -138,8 +140,6 @@ Char STRspor2sp[] = { ' ', '|', '|', ' ' >> Char STRsporsp[] = { ' ', '|', ' ', '\0' }; >> Char STRstar[] = { '*', '\0' }; >> Char STRstatus[] = { 's', 't', 'a', 't', 'u', 's', '\0' }; >> -Char STRsymcent[] = { '%', ' ', '\0' }; >> -Char STRsymhash[] = { '#', ' ', '\0' }; >> Char STRterm[] = { 't', 'e', 'r', 'm', '\0' }; >> Char STRthen[] = { 't', 'h', 'e', 'n', '\0' }; >> Char STRtilde[] = { '~', '\0' }; >> Index: bin/csh/csh.c >> =================================================================== >> RCS file: /var/cvs/src/bin/csh/csh.c,v >> retrieving revision 1.41 >> diff -u -p -r1.41 csh.c >> --- bin/csh/csh.c 30 Aug 2017 06:42:21 -0000 1.41 >> +++ bin/csh/csh.c 8 Dec 2017 12:16:00 -0000 >> @@ -401,7 +401,7 @@ main(int argc, char *argv[]) >> * Set up the prompt. >> */ >> if (prompt) { >> - set(STRprompt, Strsave(uid == 0 ? STRsymhash : STRsymcent)); >> + set(STRprompt, Strsave(uid == 0 ? STRpromptroot : STRpromptuser)); >> /* that's a meta-questionmark */ >> set(STRprompt2, Strsave(STRmquestion)); >> } >> @@ -1283,7 +1283,16 @@ printprompt(void) >> for (cp = value(STRprompt); *cp; cp++) >> if (*cp == HIST) >> (void) fprintf(cshout, "%d", eventno + 1); >> - else { >> + else if (*cp == '%' && *(cp + 1) == 'm') { >> + char hostname[HOST_NAME_MAX + 1]; >> + char *p; >> + >> + gethostname(hostname, sizeof hostname); >> + if ((p = strchr(hostname, '.')) != NULL) >> + *p = '\0'; >> + fprintf(cshout, "%s", hostname); >> + cp++; >> + } else { >> if (*cp == '\\' && cp[1] == HIST) >> cp++; >> (void) vis_fputc(*cp | QUOTE, cshout); >> Index: bin/ksh/lex.c >> =================================================================== >> RCS file: /var/cvs/src/bin/ksh/lex.c,v >> retrieving revision 1.72 >> diff -u -p -r1.72 lex.c >> --- bin/ksh/lex.c 7 Dec 2017 01:54:33 -0000 1.72 >> +++ bin/ksh/lex.c 8 Dec 2017 11:02:10 -0000 >> @@ -1246,7 +1246,8 @@ dopprompt(const char *sp, int ntruncate, >> cp++; >> if (!*cp) >> break; >> - if (Flag(FSH)) >> + /* Expand \h and \$ for both, sh(1) and ksh(1) */ >> + if (Flag(FSH) && !(*cp == 'h' || *cp == 'p')) >> snprintf(strbuf, sizeof strbuf, "\\%c", *cp); >> else switch (*cp) { >> case 'a': /* '\' 'a' bell */ >> Index: bin/ksh/main.c >> =================================================================== >> RCS file: /var/cvs/src/bin/ksh/main.c,v >> retrieving revision 1.84 >> diff -u -p -r1.84 main.c >> --- bin/ksh/main.c 7 Dec 2017 01:54:33 -0000 1.84 >> +++ bin/ksh/main.c 8 Dec 2017 10:26:35 -0000 >> @@ -316,7 +316,7 @@ main(int argc, char *argv[]) >> /* Set PS1 if it isn't set */ >> if (!(vp->flag & ISSET)) { >> /* setstr can't fail here */ >> - setstr(vp, safe_prompt, KSH_RETURN_ERROR); >> + setstr(vp, "\\h\\$ ", KSH_RETURN_ERROR); >> } >> } >> >> >>