Bir modülün iki kere kurulmasını nasıl başarılı bir şekilde yapabilirim?


2

Yeniden çalıştırılabilir olması gereken bir bash betiğim var. O içerir

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

Bu iki kez çalışırsa, hatalar

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

Apt-get veya yum gibi araçların aksine, modül zaten kuruluysa pecl hata kodu verir, oysa başarı bildirmesini istiyorum.

Stdout / stderr'i yakalayabilir ve grep yapabilirim ancak aynı şeyi başarmanın daha az kesilmez bir yolu var mı?


'Idempotently' kelimesinin mükemmel kullanımı - bakmak zorundaydı, ama durumu mükemmel bir şekilde tarif ediyor.
Argonauts

Yanıtlar:


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

1

Ayrımcılık yapabilirsin ve maskelemek

geri dönüş değeri pecl install foo aşağıdaki teknik ile komut. Çağrının döndürdüğü değeri kaydeder, ancak 'true' komutu etkin bir şekilde gizler, böylece ifade ne olursa olsun 0 döndürür retVal.

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

Fakat...

bu pek yardımcı olmaz, çünkü pecl install Arızanın niteliğine bakılmaksızın 1 değerini döndürüyor gibi görünüyor - hızlı bir test zaten kurulu bir paket veya hata bulunmayan bir paketin ikisinin de 1 döndüreceğini gösterdi.

Bunun yerine aramadan önce paketin kurulu olup olmadığını kontrol ediyorum. pecl install.

Bir paketin kurulu olup olmadığını kontrol etmek için, adın pecl önekini içermediğini farz ediyorum. jsonc pecl / jsonc değildir; ve pecl list-all çıktısının her zaman pecl ile başlayacağını. Netleştirmek için, jsonc paketi ile çalıştığımızı varsayalım:

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

Bu çıktıya neden olur (kurulu olduğu varsayılarak):

pecl/jsonc                    1.3.10 JavaScript Object Notation

Yanlışlıkla bir paketin kurulu olduğunu ilan etmekten kaçınmak için grep ile kullanılan regex bu çıktı formatını kullanır - eğer sadece paket ismiyle eşleşirsek, jsonc üzerindeki bir eşleşme de jsoncde ile eşleşir (gerçek bir paket değil). Yani regex olmak için hattın başlangıcı için arıyor pecl/ paket adından sonra paket adından sonra bir boşluk bırakılarak: "^pecl/$pkg "

Bu regex'i, kullanılan olası paket adlarına göre değiştirmeniz gerekebilir.

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

Eğer pecl list-all | grep ... kurulu paketleri kontrol ederken hatalı davranırsanız, komutu da kullanabilirsiniz. pecl info $pkg. Çok fazla ilgilenmedim, ancak sorgulanan paket yüklendiğinde 0 (ve stdout'a bir demet bilgi) döndürüyor ve paket yüklenmediğinde 1 döndürüyor (ve stderr için bir hata ).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.