variavel Como verificar se o comando existe em um script de shell?




shell script variavel recebe comando (7)

Esta questão já tem uma resposta aqui:

Eu estou escrevendo meu primeiro script de shell. No meu script, gostaria de verificar se existe um determinado comando e, se não, instale o executável. Como eu verificaria se esse comando existe?

if #check that foobar command doesnt exist
then
    #now install foobar
fi

A questão não especifica um shell, então para aqueles que usam fish (friendly interactive shell):

if command --search foo >/dev/null do
  echo exists
else
  echo does not exist
end

Para compatibilidade básica POSIX, use o sinalizador -v que é um alias para --search ou -s .


Uma função que tenho em um script de instalação feito exatamente para isso

function assertInstalled() {
    for var in "[email protected]"; do
        if ! which $var &> /dev/null; then
            echo "Install $var!"
            exit 1
        fi
    done
}

exemplo de chamada:

assertInstalled zsh vim wget python pip git cmake fc-cache

tente usar o type :

type foobar

Por exemplo:

$ type ls
ls is aliased to `ls --color=auto'

$ type foobar
-bash: type: foobar: not found

Isto é preferível a which por algumas razões:

1) o padrão which implementações suportam apenas a opção -a que mostra todas as opções, então você tem que encontrar uma versão alternativa para suportar aliases

2) O tipo dirá exatamente o que você está olhando (seja uma função bash ou um alias ou um binário apropriado).

3) tipo não requer um subprocesso

4) tipo não pode ser mascarado por um binário (por exemplo, em uma caixa linux, se você criar um programa chamado que aparece no caminho antes do real which , as coisas batem o ventilador. type , por outro lado, é um shell construído -em [sim, um subordinado inadvertidamente fez isso uma vez]


Verifique se existe um programa a partir de um script Bash . Em qualquer script de shell, é melhor executar o command -v $command_name para testar se $command_name pode ser executado. No bash você pode usar o hash $command_name , que também hashes o resultado de qualquer pesquisa de caminho, ou type -P $binary_name se você quiser apenas ver binários (não funções, etc.)


Em geral, isso depende do seu shell, mas se você usar bash, zsh, ksh ou sh (conforme fornecido pelo dash), o seguinte deve funcionar:

if ! type "$foobar_command_name" > /dev/null; then
  # install foobar here
fi

Para um script de instalação real, você provavelmente desejará ter certeza de que o type não retornará com sucesso no caso em que houver um alias foobar . No bash você poderia fazer algo assim:

if ! foobar_loc="$(type -p "$foobar_command_name")" || [[ -z $foobar_loc ]]; then
  # install foobar here
fi

which <cmd>

veja também opções which suportam aliases se aplicáveis ​​ao seu caso.

Exemplo

$ which foobar
which: no foobar in (/usr/local/bin:/usr/bin:/cygdrive/c/Program Files (x86)/PC Connectivity Solution:/cygdrive/c/Windows/system32/System32/WindowsPowerShell/v1.0:/cygdrive/d/Program Files (x86)/Graphviz 2.28/bin:/cygdrive/d/Program Files (x86)/GNU/GnuPG
$ if [ $? -eq 0 ]; then echo "foobar is found in PATH"; else echo "foobar is NOT found in PATH, of course it does not mean it is not installed."; fi
foobar is NOT found in PATH, of course it does not mean it is not installed.
$

PS: Note que nem tudo que está instalado pode estar no PATH. Geralmente, para verificar se algo está "instalado" ou não, seria necessário usar comandos relacionados à instalação relevantes para o sistema operacional. Por exemplo, rpm -qa | grep -i "foobar" rpm -qa | grep -i "foobar" para RHEL.


Cinco maneiras, 4 para bash e 1 adição para zsh:

  • type foobar &> /dev/null
  • hash foobar &> /dev/null
  • command -v foobar &> /dev/null
  • which foobar &> /dev/null
  • (( $+commands[foobar] )) (somente zsh)

Você pode colocar qualquer um deles na sua cláusula if . De acordo com meus testes ( https://www.topbug.net/blog/2016/10/11/speed-test-check-the-existence-of-a-command-in-bash-and-zsh/ ), o O primeiro e terceiro métodos são recomendados em bash e o quinto método é recomendado em zsh em termos de velocidade.





shell