모듈을 pe 등적으로 두 번 설치하려면 어떻게해야합니까?


2

다시 실행할 수있는 bash 스크립트가 있습니다. 그것은 포함

pecl install foo ||
{
    echo "Could not install foo!";
    exit 1;
}

이것이 두 번 실행되면 오류가 발생합니다

pecl/foo is already installed and is the same as the released version 1.2.3
install failed
Could not install foo!

apt-get 또는 yum과 같은 도구와 달리 pecl은 모듈이 이미 설치된 경우 오류 코드를 반환하지만 성공을보고하려고합니다.

stdout / stderr을 캡처하고 grep 할 수는 있지만 덜 해킹하는 방법이 있습니까?


'아이디 포텐테이 (idempotently)'라는 단어의 훌륭한 사용은 그것을 찾아야 만했지만 상황을 완벽하게 묘사하고있다.
Argonauts

답변:


2
if ! pecl list | grep foo >/dev/null 2>&1;
then
    pecl install foo ||
    {
        echo_err "Could not pecl install foo";
        exit 1;
    }
fi

2

당신은 차별 하고 숨길 수 있습니다

pecl install foo아래 기술 을 사용한 명령 의 반환 값 호출의 리턴 값을 저장하지만 'true'명령이 효과적으로이를 마스크하여 명령문이 값에 관계없이 0을 리턴합니다 retVal.

pecl install foo >/dev/null 2>&1 || { retVal=$?; true; }

그러나...

pecl install실패의 특성에 관계없이 1의 값을 반환하는 것처럼 보이 므로이 방법은별로 도움이되지 않습니다 . 빠른 테스트에서 이미 설치된 패키지 또는 패키지를 찾을 수 없음 오류가 모두 1을 반환 함을 보여줍니다.

대신 호출하기 전에 패키지가 이미 설치되어 있는지 간단히 확인하려고 pecl install합니다.

패키지가 설치되어 있는지 확인하려면 이름에 pecl 접두사가 포함되어 있지 않다고 가정합니다. 예 : jsonc not pecl / jsonc; pecl list-all의 출력은 항상 pecl로 시작합니다. 명확히하기 위해 jsonc 패키지로 작업하고 있다고 가정 해보십시오.

 pkg="jsonc"
 pecl list-all | grep "$pkg"

이 출력이 설치되어 있다고 가정합니다.

pecl/jsonc                    1.3.10 JavaScript Object Notation

패키지를 잘못 선언하지 않도록 grep과 함께 사용되는 정규 표현식은 해당 출력 형식을 활용합니다. 패키지 이름과 단순히 일치하는 경우 jsonc의 일치도 jsoncde와 일치합니다 (실제 패키지는 아님). 따라서 정규 표현식은 pecl/패키지 이름 뒤에 공백 이있는 줄의 시작 부분 과 패키지 이름을 찾습니다 ."^pecl/$pkg "

사용 가능한 패키지 이름을 기반으로 정규식을 수정해야 할 수도 있습니다.

#!/bin/bash

if [ $# -lt 1 ]; then
  echo "Package name must be passed as sole argument"
  exit 2
else
  pkg="$1"
fi

if pecl list-all | grep -Eq "^pecl/$pkg " ; then
  echo "package $pkg is already installed"
  exit 0
else # not installed
  if pecl -q install "$pkg" >/dev/null ; then
    echo "Package $pkg installed successfully"
    exit 0
  else
    echo "Error occurred during installation of $pkg"
    exit 1
  fi
fi

pecl list-all | grep ...설치된 패키지를 확인할 때 명령이 제대로 작동하지 않으면 명령을 사용할 수도 있습니다 pecl info $pkg. 많이 조사하지는 않았지만 쿼리 할 패키지가 설치되면 0 (그리고 많은 정보를 stdout에 반환)하고 패키지가 설치되지 않은 경우 1을 반환합니다 (그리고 stderr에 오류가 있음) ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.