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