Hi,
Attatched is a patch that fixes the annoying bug in ash prmpt expansion.
Currently the default PS1='\w \$ ' will always show a '$' as prompt
while PS1='\w \\$ ' will show a '#' if effective user is root and '$'
otherwise.
The problem is that the prompt string is expanded as a normal double
quote expansion (readtoken1()) before its sent to the
libbb/lineedit.c:parse_prompt() function. The function readtoken1() will
correctly convert '\$' to '$' before its send to parse_prompt() which is
looking for '\$'.
The attatched patch adds a PSSYNTAX expansion style which is identical
as the DQSYNTAX, except that it keep '\$' as '\$'.
The patch is my contribution to the mess. Please let me know if there
are better ways to handle this.
-nc
Index: shell/ash.c
===================================================================
--- shell/ash.c (revision 19828)
+++ shell/ash.c (working copy)
@@ -2494,6 +2494,7 @@
#define DQSYNTAX 1 /* in double quotes */
#define SQSYNTAX 2 /* in single quotes */
#define ARISYNTAX 3 /* in arithmetic */
+#define PSSYNTAX 4 /* prompt */
#if ENABLE_ASH_OPTIMIZE_FOR_SIZE
#define USE_SIT_FUNCTION
@@ -9891,6 +9892,7 @@
int dqvarnest = 0; /* levels of variables expansion within double quotes */
int oldstyle = 0;
int prevsyntax = 0; /* syntax before arithmetic */
+ int pssyntax = 0; /* we are expanding a prompt string */
#if __GNUC__
/* Avoid longjmp clobbering */
(void) &out;
@@ -9907,6 +9909,10 @@
startlinno = plinno;
dblquote = 0;
+ if (syntax == PSSYNTAX) {
+ pssyntax = 1;
+ syntax = DQSYNTAX;
+ }
if (syntax == DQSYNTAX)
dblquote = 1;
quotef = 0;
@@ -9949,11 +9955,15 @@
if (doprompt)
setprompt(2);
} else {
+ if (c == '$' && pssyntax) {
+ USTPUTC(CTLESC, out);
+ USTPUTC('\\', out);
+ }
if (dblquote &&
c != '\\' && c != '`' &&
c != '$' && (
c != '"' ||
- eofmark != NULL)
+ eofmark != NULL)
) {
USTPUTC(CTLESC, out);
USTPUTC('\\', out);
@@ -10784,7 +10794,7 @@
/* XXX Fix (char *) cast. */
setinputstring((char *)ps);
- readtoken1(pgetc(), DQSYNTAX, nullstr, 0);
+ readtoken1(pgetc(), PSSYNTAX, nullstr, 0);
popfile();
n.narg.type = NARG;
_______________________________________________
busybox mailing list
[email protected]
http://busybox.net/cgi-bin/mailman/listinfo/busybox