Index: bin/sh/parser.c =================================================================== --- bin/sh/parser.c +++ bin/sh/parser.c @@ -40,6 +40,8 @@ #include __FBSDID("$FreeBSD$"); +#include +#include #include #include #include @@ -130,6 +132,7 @@ static void synerror(const char *) __dead2; static void setprompt(int); static int pgetc_linecont(void); +static void getusername(char *, size_t); static void * @@ -1969,6 +1972,25 @@ return (c); } + +static void +getusername(char *name, size_t namelen) +{ + static struct passwd *pw; + static uid_t uid; + + if (pw == NULL) { + uid = getuid(); + pw = getpwuid(uid); + } + + if (pw == NULL) + snprintf(name, namelen, "%u", uid); + else + snprintf(name, namelen, "%s", pw->pw_name); +} + + /* * called by editline -- any expansions to the prompt * should be added here. @@ -2024,6 +2046,17 @@ while ((ps[i] != '\0') && (ps[i] != trim)) i++; --i; + break; + + /* + * User name. + */ + case 'u': + ps[i] = '\0'; + getusername(&ps[i], PROMPTLEN - i); + /* Skip to end of username. */ + while (ps[i + 1] != '\0') + i++; break; /* Index: bin/sh/sh.1 =================================================================== --- bin/sh/sh.1 +++ bin/sh/sh.1 @@ -1402,6 +1402,8 @@ This system's fully-qualified hostname (FQDN). .It Li \eh This system's hostname. +.It Li \eu +User name. .It Li \eW The final component of the current working directory. .It Li \ew Index: share/skel/dot.shrc =================================================================== --- share/skel/dot.shrc +++ share/skel/dot.shrc @@ -33,7 +33,7 @@ # set prompt: ``username@hostname:directory $ '' -PS1="`whoami`@\h:\w \\$ " +PS1="\u@\h:\w \\$ " # search path for cd(1) # CDPATH=:$HOME