
I've looked for a while, and it seems that there is no easy way to do this, not even in bash, and worse with /bin/sh. So this is kind of resorting to a simple parsing of the input, and using `eval' if it starts with a tilde. Note the hack of not doing that when there is a space, otherwise the `eval' thing will silently ignore it. This hack means that it's easy to get into a mess if quotes are used after a tilde, but that was already the case with the use of `eval' to handle environment variables. It's not a real security issue, however, since we're talking about a user who can just run any command anyway. Also including a test file for the expansion functionality. If anyone wants to improve this code, making the tests pass would reveal the tricky issues. [FWIW, I've asked on the #bash channel, and the only serious suggestion was getting the paths as command-line arguments. This will, however, defeat the point of being newbie friendly...] Closes PR 12893.
48 lines
1.0 KiB
Bash
Executable File
48 lines
1.0 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
awk -- '
|
|
/^expand_path_var()/ { showing = 1; }
|
|
{ if (showing) print; }
|
|
/^}/ { showing = 0; }
|
|
' "`dirname \"$0\"/`/installer-header" > "/tmp/test-$$"
|
|
. "/tmp/test-$$"
|
|
rm "/tmp/test-$$"
|
|
|
|
test() {
|
|
foo="$1"
|
|
expand_path_var foo
|
|
if [ ! "x$foo" = "x$2" ]; then
|
|
echo "fail: $1 -> $foo; expected $2" 1>&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
test 'blah' "blah"
|
|
test 'blah blah' "blah blah"
|
|
test 'blah blah' "blah blah"
|
|
test 'blah=blah' "blah=blah"
|
|
test 'x=1 y=2 z=3' "x=1 y=2 z=3"
|
|
test '$HOME' "$HOME"
|
|
test '$HOME/foo' "$HOME/foo"
|
|
test '$HOME/ foo' "$HOME/ foo"
|
|
test '$HOME / foo' "$HOME / foo"
|
|
test '~' "$HOME"
|
|
test '~/' "$HOME/"
|
|
test '~/x' "$HOME/x"
|
|
test '~/x/y' "$HOME/x/y"
|
|
test '~/x /y' "$HOME/x /y"
|
|
test '~/ x / y ' "$HOME/ x / y "
|
|
test '~/ ' "$HOME/ "
|
|
test '~ ' "~ "
|
|
test '~eli' "$HOME"
|
|
test '~eli ' "~eli "
|
|
test '~e li' "~e li"
|
|
test '~ eli' "~ eli"
|
|
test '~eli /x' "~eli /x"
|
|
test '~root/x' "/root/x"
|
|
test '~bleh' "~bleh"
|
|
test '~bleh ' "~bleh "
|
|
test '~/x y' "$HOME/x y"
|
|
test '~/x;pwd' "$HOME/x;pwd"
|
|
echo "All tests passed."
|