Czasami definiuję funkcję, która cienia plik wykonywalny i poprawia jego argumenty lub dane wyjściowe. Więc funkcja ma taką samą nazwę jak plik wykonywalny i potrzebuję sposobu, w jaki sposób uruchomić plik wykonywalny z funkcji bez wywoływania funkcji rekurencyjnie. Na przykład, aby automatycznie uruchomić wyjście fossil diffprzez colordiffi less -Rużywam:
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" "$@"
}
Gdybym był pewien lokalizacji pliku wykonywalnego, mógłbym po prostu wpisać /usr/bin/fossil. Bash rozpoznaje, że /oznacza to, że jest to plik wykonywalny, a nie funkcja. Ale ponieważ nie znam dokładnej lokalizacji, muszę zadzwonić whichi sprawdzić wynik. Czy istnieje prostszy sposób?
/oznacza to, że polecenie jest wykonywalne, a nie funkcją”. Ściśle mówiąc, to nie prawda. W moim przekonaniu, że jest to okropna (i nieudokumentowana) decyzja projektowa, bash pozwala, aby nazwy funkcji zawierały ukośniki. W ukośniki po prostu spowodować/usr/bin/fossil, aby być inna struna odfossiltak, kiedy mówisz/usr/bin/fossil, że nie próbuje uruchomićfossilfunkcję.