실행 파일이 있는지 확인하고 없으면 설치하십시오.

실행 파일이 있는지 확인하고 없으면 설치하십시오.

구글링해서 이런 글을 찾았습니다.게시물 링크. 거기에서 다음 프로그램/도구 설치 여부를 제어하는 ​​명령을 찾았습니다. 그래서 나는 그것을 사용하기로 결정했습니다.

#!/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

내가 이 일을 제대로 하고 있는 걸까? 아니면 뭔가 문제가 있는 걸까요?

program/tool name나는 방법이 필요 programs variable하고 그것은 내 컴퓨터에서 실행될 것입니다.

답변1

command -vif 조건의 반환 코드를 사용하여 설치되었는지 간단히 확인할 수 있습니다 .아니요설치됨

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

이 옵션은 command -vPOSIX와 호환됩니다. apt-get update모든 루프 반복 대신 한 번만 실행할 수 있습니다 . 또한 programs반복을 위한 배열이어야 하는 변수를 정의했습니다 .

답변2

특정 명령이 누락된 경우에만 스크립트를 종료하려면 다음을 수행하십시오.

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
}

그러나 누락된 명령도 설치하려는 경우:

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
}

예:

$ 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

노트:

  1. 위의 코드는 Bash 관련 구문을 사용합니다.
  2. 때때로 명령 이름이 패키지 이름과 다르다는 점을 고려하면 이러한 경우 두 번째 기능이 작동하지 않습니다.

관련 정보