tutorial - shell script variavel recebe comando




Como verificar se o comando existe em um script de shell? (6)

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 .


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.


Uma função que funciona tanto no bash quanto no zsh:

# Return the first pathname in $PATH for name in $1
function cmd_path () {
  if [[ $ZSH_VERSION ]]; then
    whence -cp "$1" 2> /dev/null
  else  # bash
     type -P "$1"  # No output if not in $PATH
  fi
}

Não-zero é retornado se o comando não for encontrado em $PATH .


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

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.)


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.





shell