Сценарій Bash для виявлення системи управління версіями, перевіряючи стан повернення команди


11

Я працюю над сценарієм bash, над яким я хотів би працювати для декількох типів VCS. Я думаю про тестування, чи каталог є репо для системи, запустивши типову команду info та перевіривши код повернення, успіх чи помилку. У псевдокоді:

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

Я можу запустити команду, наприклад, darcs show repoі використати $?для отримання коду повернення.

Моє запитання: чи є акуратний спосіб запустити і повернути номер повернення коду в одному рядку? наприклад

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

Або мені потрібно визначити функцію?

Додатковою вимогою є те, що слід друкувати і stderr, і stdout.

Відповіді:


15

Якщо автоматично перевіряється код повернення:

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

Ви також можете запустити команду і використовувати && (логічний AND) або || (логічно АБО) після цього перевірити, вдалось це чи ні:

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

Перенаправлення stdoutі stderrможе бути зроблено один разexec

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"

Перші два - execце збереження дескрипторів файлів stdinта stderrфайлів, третій перенаправляє обидва /dev/null(якщо вони бажають). Останні два execвідновити дескриптори файлів знову. Все між ними перенаправляється нікуди.

Додайте інші чеки репо, як запропонував Жилль.


Приємно і чисто, проте ці методи роздруковують повідомлення користувачеві. Я вважаю за краще, щоб сценарій був мовчазним (я додав це до питання).
Найлл Мерфі

2
Чому ви запускаєте їх у передпласті? Це зайве.
Кріс Даун

4

Як уже згадували інші, if commandтестуйте, чи commandвдалося. Насправді [ … ]це звичайна команда, яку можна використовувати поза ifабо whileумовно, хоча це нечасто.

Однак для цієї програми я би перевірив існування характерних каталогів. Це буде правильним у більш кращих випадках. Версія Bash / ksh / zsh / dash (неперевірена):

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

Ну, це не дуже красиво, але це один із способів зробити це вбудовано:

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

За визначенням, якщо тестується код виходу команди, тому вам не потрібно робити явне порівняння, якщо ви не хочете більше успіху чи невдачі. Мабуть, є більш елегантний спосіб зробити це.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.