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 diff
przez colordiff
i less -R
uż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ć which
i 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 odfossil
tak, kiedy mówisz/usr/bin/fossil
, że nie próbuje uruchomićfossil
funkcję.