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ę.Odpowiedzi:
Użyj
command
wbudowanej powłoki:źródło
\date
.W skryptach
#!
linia często służy/bin/env bash
do uruchamiania polecenia bash na podstawie ścieżki. (Może się różnić w przypadku niektórych narzędzi). To też powinno tu działać ...(
command
Alternatywa powinna również działać, ale może zależeć od konkretnej powłoki) (Działa na powłoce Bourne'a w systemie Solaris, ale w rzeczywistości działa/bin/command
w tym przypadku, która jest powłoką wbudowaną w Bash)Zarówno
/bin/command
i/bin/env
jest wymieniony w SUS, więc wszystkie implementacje zgodne powinien ją mieć.źródło
env
. Miałem wątpliwości, którą odpowiedź powinienem zaakceptować, ale ponieważ pytanie dotyczy bash , jego wbudowanecommand
rozwiązanie jest najlepszym rozwiązaniem.command
pliku wykonywalnego, alecommand
działa także wdash
,ksh
izsh
. Zakładam więc, że jest to powłoka wbudowana nie tylko wbash
. pastebin.com/fi3gyNse/bin/env
po haszowaniu, jeśli nie chcą sztywno kodować ścieżki powłoki)Odpowiedź Gerta uświadomiła mi, że można również użyć
nice
do tego celu (faktycznie miałem go w jednym ze swoich skryptów, nie zdając sobie z tego sprawy):Jest mniej elegancki niż inne odpowiedzi, ale w niektórych okolicznościach może być przydatną opcją.
źródło
`which date`
.`which something`
polega na tym, że jeśli nie masomething
pliku wykonywalnego, mogą się zdarzyć niefortunne rzeczy. Na przykład, jeśliecho
brakuje, to`which echo` /bin/rm preciousFile
robi coś zupełnie innego niż zamierzone.