Иногда я определяю функцию, которая скрывает исполняемый файл и настраивает его аргументы или вывод. Поэтому имя функции совпадает с именем исполняемого файла, и мне нужен способ запуска исполняемого файла из функции без рекурсивного вызова функции. Например, для автоматического запуска вывода fossil diff
через colordiff
и less -R
я использую:
function fossil () {
local EX=$(which fossil)
if [ -z "$EX" ] ; then
echo "Unable to find 'fossil' executable." >&2
return 1
fi
if [ -t 1 ] && [ "$1" == "diff" ] ; then
"$EX" "$@" | colordiff | less -R
return
fi
"$EX" "$@"
}
Если бы я был уверен в расположении исполняемого файла, я мог бы просто напечатать /usr/bin/fossil
. Bash признает, что это /
означает, что команда - это исполняемый файл, а не функция. Но так как я не знаю точного местоположения, я должен прибегнуть к звонку which
и проверке результата. Есть ли более простой способ?
/
означает, что команда является исполняемым файлом, а не функцией». Строго говоря, это не так. В то, что я считаю ужасным (и недокументированным) дизайнерским решением, bash позволяет именам функций содержать косую черту. Косая черта просто приводит/usr/bin/fossil
к тому, что она отличается от строкиfossil
, поэтому, когда вы говорите/usr/bin/fossil
, она не пытается запуститьfossil
функцию.