diff --git a/expand.cpp b/expand.cpp index 0eb6a72f5..ed6b6e6d0 100644 --- a/expand.cpp +++ b/expand.cpp @@ -1633,7 +1633,6 @@ static void expand_home_directory(wcstring &input) if (userinfo == NULL) { tilde_error = true; - input[0] = L'~'; } else { @@ -1641,10 +1640,17 @@ static void expand_home_directory(wcstring &input) } } - if (! tilde_error) + wchar_t *realhome; + realhome = wrealpath(home, NULL); + + if (! tilde_error && realhome) { - input.replace(input.begin(), input.begin() + tail_idx, home); + input.replace(input.begin(), input.begin() + tail_idx, realhome); } + else + { + input[0] = L'~'; + } } } diff --git a/tests/expansion.in b/tests/expansion.in index a22251272..34662d487 100644 --- a/tests/expansion.in +++ b/tests/expansion.in @@ -80,3 +80,15 @@ echo $foo[d] echo ()[1] echo ()[d] + +# Test tilde expansion +set tmpdir (mktemp -d) +mkdir $tmpdir/realhome +ln -s $tmpdir/realhome $tmpdir/linkhome +set expandedtilde (env HOME=$tmpdir/linkhome ../fish -c 'echo ~') +if test $expandedtilde != $tmpdir/realhome + echo '~ expands to' $expandedtilde ' - expected ' $tmpdir/realhome +end +unlink $tmpdir/linkhome +rmdir $tmpdir/realhome +rmdir $tmpdir