Função de empacotador de instalação sob demanda para executáveis

1

Como faço a função a seguir funcionar corretamente

# Install git on demand
function git()
{
    if ! type git &> /dev/null; then sudo $APT install git; fi
    git $*;
}

fazendo git $* chamar /usr/bin/git em vez da função git() ?

    
por Nordlöw 03.04.2014 / 23:54

2 respostas

2

Assim:

# Install git on demand
function git()
{
    if ! type -f git &> /dev/null; then sudo $APT install git; fi
    command git "$@";
}

O command embutido suprime a pesquisa de função. Eu também mudei seu $* para "$@" porque isso vai lidar corretamente com argumentos que não são uma palavra (por exemplo, nomes de arquivos com espaços).

Além disso, adicionei o argumento -f a type , porque senão notará a função.

Você pode querer considerar o que fazer em caso de erro (por exemplo, quando apt-get install falha).

    
por 04.04.2014 / 00:02
1

Ou talvez uma função mais genérica seja capaz de executar qualquer comando. Neste caso, o '-f' pode ser substituído por '-t'. A colisão com a função não ocorrerá.

function runcmd()
{
  if ! type -t $1 >/dev/null; then
    pkg=$(apt-file search -x "bin.*$1\$" | cut -d: -f1)
    sudo apt-get install $pkg
  fi
  eval "$@"
}

É claro que os erros do 'apt-get install' devem ser tratados.

    
por 04.04.2014 / 00:40