diff options
-rw-r--r-- | lash.c | 18 | ||||
-rw-r--r-- | sh.c | 18 | ||||
-rw-r--r-- | shell/lash.c | 18 |
3 files changed, 42 insertions, 12 deletions
@@ -1014,7 +1014,6 @@ static int expand_arguments(char *command) * wordexp can't do for us, namely $? and $! */ src = command; while((dst = strchr(src,'$')) != NULL){ - printf("dollar '%s'\n", dst); var = NULL; switch(*(dst+1)) { case '?': @@ -1057,14 +1056,25 @@ static int expand_arguments(char *command) } else { /* Looks like an environment variable */ char delim_hold; - src=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?."); + int num_skip_chars=1; + int dstlen = strlen(dst); + /* Is this a ${foo} type variable? */ + if (dstlen >=2 && *(dst+1) == '{') { + src=strchr(dst+1, '}'); + num_skip_chars=2; + } else { + src=strpbrk(dst+1, " \t~`!$^&*()=|\\[];\"'<>?./"); + } if (src == NULL) { - src = dst+strlen(dst); + src = dst+dstlen; } delim_hold=*src; *src='\0'; /* temporary */ - var = getenv(dst + 1); + var = getenv(dst + num_skip_chars); *src=delim_hold; + if (num_skip_chars==2) { + src++; + } } if (var == NULL) { /* Seems we got an un-expandable variable. So delete it. */ @@ -1014,7 +1014,6 @@ static int expand_arguments(char *command) * wordexp can't do for us, namely $? and $! */ src = command; while((dst = strchr(src,'$')) != NULL){ - printf("dollar '%s'\n", dst); var = NULL; switch(*(dst+1)) { case '?': @@ -1057,14 +1056,25 @@ static int expand_arguments(char *command) } else { /* Looks like an environment variable */ char delim_hold; - src=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?."); + int num_skip_chars=1; + int dstlen = strlen(dst); + /* Is this a ${foo} type variable? */ + if (dstlen >=2 && *(dst+1) == '{') { + src=strchr(dst+1, '}'); + num_skip_chars=2; + } else { + src=strpbrk(dst+1, " \t~`!$^&*()=|\\[];\"'<>?./"); + } if (src == NULL) { - src = dst+strlen(dst); + src = dst+dstlen; } delim_hold=*src; *src='\0'; /* temporary */ - var = getenv(dst + 1); + var = getenv(dst + num_skip_chars); *src=delim_hold; + if (num_skip_chars==2) { + src++; + } } if (var == NULL) { /* Seems we got an un-expandable variable. So delete it. */ diff --git a/shell/lash.c b/shell/lash.c index 34dca04..8f19e52 100644 --- a/shell/lash.c +++ b/shell/lash.c @@ -1014,7 +1014,6 @@ static int expand_arguments(char *command) * wordexp can't do for us, namely $? and $! */ src = command; while((dst = strchr(src,'$')) != NULL){ - printf("dollar '%s'\n", dst); var = NULL; switch(*(dst+1)) { case '?': @@ -1057,14 +1056,25 @@ static int expand_arguments(char *command) } else { /* Looks like an environment variable */ char delim_hold; - src=strpbrk(dst+1, " \t~`!$^&*()=|\\{}[];\"'<>?."); + int num_skip_chars=1; + int dstlen = strlen(dst); + /* Is this a ${foo} type variable? */ + if (dstlen >=2 && *(dst+1) == '{') { + src=strchr(dst+1, '}'); + num_skip_chars=2; + } else { + src=strpbrk(dst+1, " \t~`!$^&*()=|\\[];\"'<>?./"); + } if (src == NULL) { - src = dst+strlen(dst); + src = dst+dstlen; } delim_hold=*src; *src='\0'; /* temporary */ - var = getenv(dst + 1); + var = getenv(dst + num_skip_chars); *src=delim_hold; + if (num_skip_chars==2) { + src++; + } } if (var == NULL) { /* Seems we got an un-expandable variable. So delete it. */ |