On Fri 16-05-14 09:13:34, Chet Ramey wrote: > On 5/16/14, 5:22 AM, Libor Pechacek wrote: > > > Bash Version: 4.2 > > Patch Level: 46 > > Release Status: release > > > > Description: > > Bash prompt always shows full path in prompt instead of tilde > > abbreviation when $HOME ends with slash. > > This came up in March, 2012: > > http://lists.gnu.org/archive/html/bug-bash/2012-03/msg00055.html > > My opinion that this is not a bug in bash hasn't changed. There are a > number of easy ways to remove this trailing slash.
Proposed patch: >From da53c262cb7c356a09e5786f01e6c8c8d7301940 Mon Sep 17 00:00:00 2001 From: Libor Pechacek <lpecha...@suse.cz> Date: Fri, 23 May 2014 09:30:49 +0200 Subject: [PATCH] Make \w and \W tolerate trailing slash in $HOME Currently \w and \W abbreviate $HOME into tilde only when it ends with a character different from slash. This patch makes them tolerate trailing slashes. --- general.c | 5 ++++- parse.y | 8 ++++++-- y.tab.c | 6 +++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/general.c b/general.c index 087689eb74cc..de6093b57995 100644 --- a/general.c +++ b/general.c @@ -699,7 +699,10 @@ polite_directory_format (name) int l; home = get_string_value ("HOME"); - l = home ? strlen (home) : 0; + + /* remove trailing slashes from $HOME before comparisons */ + for (l = home ? strlen (home) : 0; l > 1 && home[l-1] == '/'; l--); + if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/')) { strncpy (tdir + 1, name + l, sizeof(tdir) - 2); diff --git a/parse.y b/parse.y index 91bf3bf649bd..2abfceb1b6ee 100644 --- a/parse.y +++ b/parse.y @@ -5384,7 +5384,7 @@ decode_prompt_string (string) { /* Use the value of PWD because it is much more efficient. */ char t_string[PATH_MAX]; - int tlen; + int tlen, l; temp = get_string_value ("PWD"); @@ -5415,7 +5415,11 @@ decode_prompt_string (string) #define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0) #define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0) /* Abbreviate \W as ~ if $PWD == $HOME */ - if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0)) + /* remove trailing slashes from $HOME before comparisons */ + t = get_string_value ("HOME"); + for (l = t ? strlen (t) : 0; l > 1 && t[l-1] == '/'; l--); + + if (c == 'W' && ((t == 0) || STREQN (t, t_string, l) == 0)) { if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0) { diff --git a/y.tab.c b/y.tab.c index 80fe9308398e..d107e5b8dec5 100644 --- a/y.tab.c +++ b/y.tab.c @@ -7727,7 +7727,11 @@ decode_prompt_string (string) #define ROOT_PATH(x) ((x)[0] == '/' && (x)[1] == 0) #define DOUBLE_SLASH_ROOT(x) ((x)[0] == '/' && (x)[1] == '/' && (x)[2] == 0) /* Abbreviate \W as ~ if $PWD == $HOME */ - if (c == 'W' && (((t = get_string_value ("HOME")) == 0) || STREQ (t, t_string) == 0)) + /* remove trailing slashes from $HOME before comparisons */ + t = get_string_value ("HOME"); + for (l = t ? strlen (t) : 0; l > 1 && t[l-1] == '/'; l--); + + if (c == 'W' && ((t == 0) || STREQN (t, t_string, l) == 0)) { if (ROOT_PATH (t_string) == 0 && DOUBLE_SLASH_ROOT (t_string) == 0) { -- 1.7.12.4