Іноді я визначаю функцію, яка затінює виконуваний файл і налаштовує його аргументи або висновки. Отже, функція має те саме ім'я, що і виконуваний файл, і мені потрібен спосіб, як запустити виконуваний файл з функції, не викликаючи функцію рекурсивно. Наприклад, для автоматичного запуску виводу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
функцію.