Melhor maneira de chamar o comando dentro de uma função shell com o mesmo nome [duplicado]

2

Eu gosto de encapsular comandos dentro de funções shell usando o mesmo nome. Mas, para evitar que a função shell se chame recursivamente, especifico o caminho completo do comando como no exemplo a seguir:

less()
{
    test 0 -lt $# && echo -ne "\e]2;$@\a\e]1;$@\a"     # Window title
    /usr/bin/less -i -rS --LONG-PROMPT --shift 5 "$@"
}

Mas, para alguns comandos, não desejo especificar o caminho porque ele pode mudar. Eu preferiria usar $PATH .

Por exemplo, minha tentativa a seguir falhou ao chamar o comando mvn usando barra invertida: \mvn

mvn()  # colorizes maven output
{
        \mvn "$@" 2>&1 | #here: the shell-function recursively calls itself indefinitely
        sed -u '                                             
    s/^\[ALL\].*/\o033[1;37m&\o033[0m/
  s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
  s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
   s/^\[INFO\].*/\o033[1;37m&\o033[0m/
  s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
  s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}

Qual é a melhor maneira de contornar esse problema?
Por favor, não sugira usar um nome de função de shell diferente.

(Eu costumo usar bash , mas estou interessado em outras soluções shell.)

    
por olibre 26.02.2013 / 11:37

2 respostas

8

Prefira seus comandos reais (não funções) com command shell embutido, ele tem exatamente o propósito que você está procurando. Portanto, sua função de shell deve ser assim:

mvn()
{
        command mvn "$@" 2>&1 |
        sed -u '
    s/^\[ALL\].*/\o033[1;37m&\o033[0m/
  s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
  s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
   s/^\[INFO\].*/\o033[1;37m&\o033[0m/
  s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
  s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}
    
por 26.02.2013 / 12:03
1

Depende de qual shell você usa. Por padrão, zfs, bash e ksh não expandem aliases com o mesmo nome que o alias, em aliases. Isso é especificamente para evitar loops [geralmente não intencionais].

Portanto, você está seguro para fazer comandos como deseja.

alias ls="echo Hello; ls"

Está perfeitamente bem.

    
por 26.02.2013 / 11:58