Verifique se um executável está presente e instale se não

1

Eu pesquisei e encontrei este post: Link para o post. De lá eu encontrei um comando que controla se o seguinte programa / ferramenta está instalado. Então eu decidi colocá-lo em uso.

#!/bin/bash
set -x

programs=$(bc nmap coreutils xmlstarlet)
if [ $(dpkg-query -W -f='${Status}' "$programs" 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
apt-get update | apt-get install "$programs" -y;
fi

Estou fazendo isso corretamente? ou há algo errado nisso?

Eu simplesmente preciso de uma maneira que eu coloque program/tool name em programs variable e então ele será executado na minha máquina.

    
por TheSebM8 28.03.2018 / 14:11

2 respostas

3

Você poderia simplesmente usar o command -v para verificar se ele está instalado, o código de retorno na condição if ajudaria você a instalar se o seu não já estivesse instalado

apt-get update
programs=(bc nmap coreutils xmlstarlet)

for program in "${programs[@]}"; do
    if ! command -v "$program" > /dev/null 2>&1; then
        apt-get install "$program" -y
    fi
done

A opção command -v é compatível com POSIX. Você pode executar apt-get update apenas uma vez e não para cada iteração do loop. Você também definiu programs como uma variável que deveria ter sido uma matriz para a iteração.

    
por 28.03.2018 / 14:17
1

Se você quiser sair do script apenas se algum comando estiver faltando:

require() {
  local command not_found

  for command; do
    if ! command -v -- "${command}" > /dev/null 2>&1; then
      printf 'ERROR: Command not found: %s\n' "${command}" >&2
      ((not_found++))
    fi
  done

  if ((not_found > 0)); then
    printf 'ERROR: Missing commands: %d\n' "${not_found}"
    exit 1
  fi
}

Mas se você também quiser instalar os comandos ausentes:

install_command_if_not_found() {
  local command commands not_found

  for command; do
    if ! command -v -- "${command}" > /dev/null 2>&1; then
      commands+=("${command}")
      ((not_found++))
    fi
  done

  if ((not_found > 0)); then
    sudo apt-get update
    sudo apt-get install -y -- "${commands[@]}"
  fi
}

Exemplo:

$ require cat foo curl bar mpv baz zenity
ERROR: Command not found: foo
ERROR: Command not found: bar
ERROR: Command not found: baz
ERROR: Missing commands: 3

Notas:

  1. O código acima usa a sintaxe específica do Bash.
  2. Lembre-se de que há casos em que o nome de um comando e o nome de seu pacote são diferentes, portanto, a segunda função não funcionará nesses casos.
por 28.03.2018 / 15:12