Komut dönüş durumunu test ederek sürüm kontrol sistemini tespit etmek için Bash betiği


11

Ben VCS çeşitli türleri için çalışmak istiyorum bir bash script üzerinde çalışıyorum. Bir dizin tipik bir bilgi komutunu çalıştırarak ve dönüş kodu, başarı veya hata kontrol ederek bir sistem için bir repo olup olmadığını test düşünüyorum. Sahte kodda:

if a svn command succeded;
    Then run svn commands
elif a darcs command succeded;
    Then run darcs commands
elif a mercurial command succeded;
    then run hg commands
else 
    something else
fi

Örneğin bir komut çalıştırabilir ve dönüş kodunu almak için darcs show repokullanabilirim $?.

Benim sorum: çalıştırmak ve dönüş kodu numarasını bir satırda döndürmek için temiz bir yolu var mı? Örneğin

if [ 0 -eq `darcs show repo`$? ]; 

Yoksa bir işlev tanımlamam mı gerekiyor?

Ek bir gereklilik hem stderr hem de stdout'un yazdırılması gerektiğidir.

Yanıtlar:


15

Dönüş kodunu otomatik olarak kontrol ederse:

if (darcs show repo); then
  echo "repo exists"
else
  echo "repo does not exist"
fi

Ayrıca komutu çalıştırabilir ve && (mantıksal AND) veya || (mantıksal VEYA) daha sonra başarılı olup olmadığını kontrol etmek için:

darcs show repo && echo "repo exists"
darcs show repo || echo "repo does not exist"

Yönlendirme stdoutve stderrile bir kez yapılabilirexec

exec 6>&1
exec 7>&2
exec >/dev/null 2>&1

if (darcs show repo); then
  repo="darcs"
elif (test -d .git); then
  repo="git"
fi

# The user won't see this
echo "You can't see my $repo"

exec 1>&6 6>&-
exec 2>&7 7>&-

# The user will see this
echo "You have $repo installed"

İlk iki execkurtarıyoruz stdinve stderrdosya tanımlayıcıları, hem üçüncü yönlendirmeler /dev/null(eğer isterse ya da bir yerde başka). Son ikisi execdosya tanımlayıcılarını geri yükler. Aradaki her şey hiçbir yere yönlendirilmez.

Gilles'in önerdiği gibi diğer repo kontrollerini ekleyin.


Güzel ve temiz, ancak bu yöntemler kullanıcıya mesajlar yazdırır. Senaryoyu sessiz olmasını tercih ederim (bunu soruya ekledim).
Niall Murphy

2
Bunları neden bir alt kabukta çalıştırıyorsunuz? Gereksiz.
Chris Down

4

Diğerlerinin de belirttiği gibi, başarılı if commandolup olmadığını test eder command. Aslında [ … ], sıradan olmasa da bir ifveya whilekoşullu dışında kullanılabilen sıradan bir komuttur .

Ancak, bu uygulama için, karakteristik dizinlerin varlığını test ederdim. Bu, daha fazla durumda doğru olacaktır. Bash / ksh / zsh / tire sürümü (test edilmemiş):

vc=
if [ -d .svn ]; then
  vc=svn
elif [ -d CVS ]; then
  vc=cvs
else
  d=$(pwd -P)
  while [ -n "$d" ]; do
    if [ -d "$d/.bzr" ]; then
      vc=bzr
    elif [ -d "$d/_darcs" ]; then
      vc=darcs
    elif [ -d "$d/.git" ]; then
      vc=git
    elif [ -d "$d/.hg" ]; then
      vc=hg
    fi
    if [ -n "$vc" ]; then break; fi
    d=${d%/*}
  done
fi
if [ -z "$vc" ]; then
  echo 1>&2 "This directory does not seem to be under version control."
  exit 2
fi

2

Çok hoş değil, ama bunu yerinde yapmanın bir yolu:

if darcs show repo > /dev/null 2>&1; then <do something>; fi

Tanım olarak, bir komutun çıkış kodunu test ederse, başarı veya başarısızlıktan fazlasını istemiyorsanız, açık bir karşılaştırma yapmanız gerekmez. Muhtemelen bunu yapmanın daha zarif bir yolu var.


0

Bir başka özlü seçenek:

[ -d .svn ] && { svn command 1; svn command 2; } 
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.