sh: Write absolute path in command -vV and type
POSIX is pretty clear that command -v, command -V and type shall write absolute pathnames. Therefore, we need to prepend the current directory's name to relative pathnames. This can happen either when PATH contains a relative pathname or when the operand contains a slash but is not an absolute pathname.
This commit is contained in:
parent
78ae1e6e15
commit
ccd0a51fda
@ -679,6 +679,21 @@ isfunc(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_absolute_path(const char *name)
|
||||||
|
{
|
||||||
|
const char *pwd;
|
||||||
|
|
||||||
|
if (*name != '/' && (pwd = lookupvar("PWD")) != NULL && *pwd != '\0') {
|
||||||
|
out1str(pwd);
|
||||||
|
if (strcmp(pwd, "/") != 0)
|
||||||
|
outcslow('/', out1);
|
||||||
|
}
|
||||||
|
out1str(name);
|
||||||
|
outcslow('\n', out1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shared code for the following builtin commands:
|
* Shared code for the following builtin commands:
|
||||||
* type, command -v, command -V
|
* type, command -v, command -V
|
||||||
@ -745,20 +760,16 @@ typecmd_impl(int argc, char **argv, int cmd, const char *path)
|
|||||||
name = padvance(&path2, &opt2, argv[i]);
|
name = padvance(&path2, &opt2, argv[i]);
|
||||||
stunalloc(name);
|
stunalloc(name);
|
||||||
} while (--j >= 0);
|
} while (--j >= 0);
|
||||||
if (cmd == TYPECMD_SMALLV)
|
if (cmd != TYPECMD_SMALLV)
|
||||||
out1fmt("%s\n", name);
|
out1fmt("%s is%s ", argv[i],
|
||||||
else
|
|
||||||
out1fmt("%s is%s %s\n", argv[i],
|
|
||||||
(cmdp && cmd == TYPECMD_TYPE) ?
|
(cmdp && cmd == TYPECMD_TYPE) ?
|
||||||
" a tracked alias for" : "",
|
" a tracked alias for" : "");
|
||||||
name);
|
print_absolute_path(name);
|
||||||
} else {
|
} else {
|
||||||
if (eaccess(argv[i], X_OK) == 0) {
|
if (eaccess(argv[i], X_OK) == 0) {
|
||||||
if (cmd == TYPECMD_SMALLV)
|
if (cmd != TYPECMD_SMALLV)
|
||||||
out1fmt("%s\n", argv[i]);
|
out1fmt("%s is ", argv[i]);
|
||||||
else
|
print_absolute_path(argv[i]);
|
||||||
out1fmt("%s is %s\n", argv[i],
|
|
||||||
argv[i]);
|
|
||||||
} else {
|
} else {
|
||||||
if (cmd != TYPECMD_SMALLV)
|
if (cmd != TYPECMD_SMALLV)
|
||||||
outfmt(out2, "%s: %s\n",
|
outfmt(out2, "%s: %s\n",
|
||||||
|
@ -69,6 +69,8 @@ ${PACKAGE}FILES+= command9.0
|
|||||||
${PACKAGE}FILES+= command10.0
|
${PACKAGE}FILES+= command10.0
|
||||||
${PACKAGE}FILES+= command11.0
|
${PACKAGE}FILES+= command11.0
|
||||||
${PACKAGE}FILES+= command12.0
|
${PACKAGE}FILES+= command12.0
|
||||||
|
${PACKAGE}FILES+= command13.0
|
||||||
|
${PACKAGE}FILES+= command14.0
|
||||||
${PACKAGE}FILES+= dot1.0
|
${PACKAGE}FILES+= dot1.0
|
||||||
${PACKAGE}FILES+= dot2.0
|
${PACKAGE}FILES+= dot2.0
|
||||||
${PACKAGE}FILES+= dot3.0
|
${PACKAGE}FILES+= dot3.0
|
||||||
@ -170,6 +172,7 @@ ${PACKAGE}FILES+= trap9.0
|
|||||||
${PACKAGE}FILES+= type1.0 type1.0.stderr
|
${PACKAGE}FILES+= type1.0 type1.0.stderr
|
||||||
${PACKAGE}FILES+= type2.0
|
${PACKAGE}FILES+= type2.0
|
||||||
${PACKAGE}FILES+= type3.0
|
${PACKAGE}FILES+= type3.0
|
||||||
|
${PACKAGE}FILES+= type4.0
|
||||||
${PACKAGE}FILES+= unalias.0
|
${PACKAGE}FILES+= unalias.0
|
||||||
${PACKAGE}FILES+= var-assign.0
|
${PACKAGE}FILES+= var-assign.0
|
||||||
${PACKAGE}FILES+= var-assign2.0
|
${PACKAGE}FILES+= var-assign2.0
|
||||||
|
21
bin/sh/tests/builtins/command13.0
Normal file
21
bin/sh/tests/builtins/command13.0
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
failures=0
|
||||||
|
|
||||||
|
check() {
|
||||||
|
if [ "$1" != "$2" ] && { [ "$#" -lt 3 ] || [ "$1" != "$3" ]; } then
|
||||||
|
echo "Mismatch found"
|
||||||
|
echo "Expected: $2"
|
||||||
|
if [ "$#" -ge 3 ]; then
|
||||||
|
echo "Alternative expected: $3"
|
||||||
|
fi
|
||||||
|
echo "Actual: $1"
|
||||||
|
: $((failures += 1))
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
check "$(cd /bin && PATH=. command -v ls)" /bin/ls /bin/./ls
|
||||||
|
check "$(cd /bin && PATH=:/var/empty/nosuch command -v ls)" /bin/ls /bin/./ls
|
||||||
|
check "$(cd / && PATH=bin command -v ls)" /bin/ls
|
||||||
|
check "$(cd / && command -v bin/ls)" /bin/ls
|
||||||
|
check "$(cd /bin && command -v ./ls)" /bin/ls /bin/./ls
|
9
bin/sh/tests/builtins/command14.0
Normal file
9
bin/sh/tests/builtins/command14.0
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
r=`cd /bin && PATH=. command -V ls`
|
||||||
|
case $r in
|
||||||
|
*/bin/ls*|*/bin/./ls*) ;;
|
||||||
|
*)
|
||||||
|
echo "Unexpected result: $r"
|
||||||
|
exit 1
|
||||||
|
esac
|
9
bin/sh/tests/builtins/type4.0
Normal file
9
bin/sh/tests/builtins/type4.0
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
r=`cd /bin && PATH=. type ls`
|
||||||
|
case $r in
|
||||||
|
*/bin/ls*|*/bin/./ls*) ;;
|
||||||
|
*)
|
||||||
|
echo "Unexpected result: $r"
|
||||||
|
exit 1
|
||||||
|
esac
|
Loading…
Reference in New Issue
Block a user