use portable "command -v" to detect installed programs, part 1
The "which" utility is not guaranteed to be installed either, and if it is, its behavior is not portable either. This means that when various programs are installed, the `which` check will report a fatal error because the which tool did not exist and the shell returned a nonzero status when attempting to fork+exec. If it did exist, it might not be an implementation of `which` that returns nonzero when commands do not exist. The general scripting suggestion is to use the "command -v" shell builtin; this is required to exist in all POSIX 2008 compliant shells, and is thus guaranteed to work everywhere. For some in-depth discussions on the topic, see: - https://mywiki.wooledge.org/BashFAQ/081 - https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then/85250#85250 Examples of open-source shells likely to be installed as /bin/sh on Linux, which implement the 15-year-old standard: ash, bash, busybox, dash, ksh, mksh and zsh. This commit changes two programs installed to end-user systems. Change-Id: I6013965bb914f5b0d593a876866b991e210ef5b8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160662 Tested-by: Jenkins Tested-by: Ilmari Lauhakangas <ilmari.lauhakangas@libreoffice.org> Reviewed-by: Ilmari Lauhakangas <ilmari.lauhakangas@libreoffice.org>
This commit is contained in:
committed by
Ilmari Lauhakangas
parent
27a1eccae1
commit
a1c854fffe
@@ -77,7 +77,7 @@ test -n "$RR" && EXTRAOPT="--record"
|
||||
for arg in "$@" $EXTRAOPT ; do
|
||||
case "$arg" in
|
||||
--record)
|
||||
if which rr >/dev/null 2>&1 ; then
|
||||
if command -v rr >/dev/null ; then
|
||||
# smoketest may already be recorded => ignore nested
|
||||
RRCHECK="rr record --nested=ignore"
|
||||
checks="c$checks"
|
||||
@@ -87,7 +87,7 @@ for arg in "$@" $EXTRAOPT ; do
|
||||
fi
|
||||
;;
|
||||
--backtrace)
|
||||
if which gdb >/dev/null 2>&1 ; then
|
||||
if command -v gdb >/dev/null ; then
|
||||
GDBTRACECHECK="gdb -nx --command=$sd_prog/gdbtrace --args"
|
||||
checks="c$checks"
|
||||
else
|
||||
@@ -96,7 +96,7 @@ for arg in "$@" $EXTRAOPT ; do
|
||||
fi
|
||||
;;
|
||||
--strace)
|
||||
if which strace >/dev/null 2>&1 ; then
|
||||
if command -v strace >/dev/null ; then
|
||||
STRACECHECK="strace -o strace.log -f -tt -s 256"
|
||||
checks="c$checks"
|
||||
else
|
||||
@@ -106,7 +106,7 @@ for arg in "$@" $EXTRAOPT ; do
|
||||
;;
|
||||
--valgrind)
|
||||
test -n "$VALGRINDCHECK" && continue;
|
||||
if which valgrind >/dev/null 2>&1 ; then
|
||||
if command -v valgrind >/dev/null ; then
|
||||
# another valgrind tool might be forced via the environment variable
|
||||
test -z "$VALGRIND" && VALGRIND="memcheck"
|
||||
# --trace-children-skip is pretty useful but supported only with valgrind >= 3.6.0
|
||||
|
||||
@@ -29,25 +29,12 @@ fi
|
||||
# do not confuse the system mail clients with OOo and Java libraries
|
||||
unset LD_LIBRARY_PATH
|
||||
|
||||
# tries to locate the executable specified
|
||||
# as first parameter in the user's path.
|
||||
which() {
|
||||
if [ ! -z "$1" ]; then
|
||||
for i in $(echo "$PATH" | sed -e 's/^:/.:/g' -e 's/:$/:./g' -e 's/::/:.:/g' -e 's/:/ /g'); do
|
||||
if [ -x "$i/$1" -a ! -d "$i/$1" ]; then
|
||||
echo "$i/$1"
|
||||
break;
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# checks for the original mozilla start script(s)
|
||||
# and restrict the "-remote" semantics to those.
|
||||
run_mozilla() {
|
||||
# find mozilla script in PATH if necessary
|
||||
if [ "$(basename "$1")" = "$1" ]; then
|
||||
moz=$(which "$1")
|
||||
moz=$(command -v "$1")
|
||||
else
|
||||
moz=$1
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user