Às vezes, defino uma função que oculta um executável e ajusta seus argumentos ou saída. Portanto, a função tem o mesmo nome que o executável, e eu preciso de uma maneira de executar o executável a partir da função sem chamar a função recursivamente. Por exemplo, para executar automaticamente a saída de fossil diff
through colordiff
e less -R
eu uso:
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" "$@"
}
Se eu tivesse certeza da localização do executável, eu poderia simplesmente digitar /usr/bin/fossil
. Bash reconhece que isso /
significa que o comando é um executável, não uma função. Mas como não sei a localização exata, tenho que recorrer à chamada which
e verificação do resultado. Existe uma maneira mais simples?
/
significa que o comando é um executável, não uma função". Estritamente falando, isso não é verdade. No que eu acredito ser uma decisão de design horrível (e não documentada), o bash permite que os nomes de funções contenham barras. As barras simplesmente fazem/usr/bin/fossil
com que seja uma sequência diferente defossil
, portanto, quando você diz/usr/bin/fossil
, não tenta executar afossil
função.Respostas:
Use o
command
shell interno:fonte
\date
.Nos scripts, a
#!
linha costuma ser usada/bin/env bash
para executar o comando bash com base no caminho. (Pode ser diferente para alguns utilitários). Isso deve funcionar aqui também ...(A
command
alternativa também deve funcionar, mas pode depender de um shell específico) (Funciona no Bourne Shell no Solaris, mas na verdade é executado/bin/command
nesse caso, que é um shell embutido no Bash)Ambos
/bin/command
e/bin/env
estão listados no SUS, portanto, todas as implementações compatíveis devem tê-lo.fonte
env
. Eu estava com dúvidas sobre qual resposta eu deveria aceitar, mas como a pergunta é sobre bash , seu built-incommand
é a melhor solução.command
executável, mascommand
também funciona emdash
,ksh
ezsh
. Então, eu suponho que é um shell embutido não apenas nobash
. pastebin.com/fi3gyNse/bin/env
após o hash-bang, se eles não querem codificar o caminho shell)A resposta de Gert me fez perceber que também se pode usar
nice
para esse fim (na verdade, eu o coloquei em um dos meus scripts sem perceber):É menos elegante que as outras respostas, mas, em algumas circunstâncias, pode ser uma opção útil.
fonte
`which date`
.`which something`
é que, se não houversomething
executável, coisas infelizes podem acontecer. Por exemplo, seecho
está faltando, então`which echo` /bin/rm preciousFile
faz algo muito diferente do pretendido.