コマンドの戻り状態をテストしてバージョン管理システムを検出するBashスクリプト

コマンドの戻り状態をテストしてバージョン管理システムを検出するBashスクリプト

いくつかのタイプのVCSで使用したいbashスクリプトを作成しています。一般的な 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てそれを使用して$?戻りコードを取得できます。

私の質問は:これを1行で実行し、戻りコード番号を返すきちんとした方法はありますか?例えば

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

それとも関数を定義する必要がありますか?

別の要件は、stderrとstdoutの両方を印刷する必要があることです。

答え1

戻りコードが自動的に確認される場合:

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

コマンドを実行し、後で&&(論理的AND)または||(論理的OR)を使用して成功したかどうかを確認することもできます。

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"

最初の 2 つのexec保存stdinおよびstderrファイル記述子、3 番目は両方/dev/null(または必要に応じて他の場所) にリダイレクトされます。最後の2つはexecファイルディスクリプタを復元します。その間のすべての内容はどこにでもリダイレクトされます。

Gilesが提案したものなどの他のストレージチェックを添付してください。

答え2

他の人がすでに述べたように、if commandテストはcommand成功しました。一般的ではありませんが、実際にはor条件の外で使用[ … ]できる一般的なコマンドです。ifwhile

ただし、このアプリケーションでは機能デ​​ィレクトリが存在するかどうかをテストします。これはより極端なケースに当てはまります。 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

答え3

まあ、あまりきれいではありませんが、インラインで行う1つの方法です。

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

定義に従ってコマンドの終了コードをテストする場合は、成功または失敗以上を望まない限り、明示的な比較を実行する必要はありません。これを行うよりエレガントな方法があるかもしれません。

答え4

別のきれいなオプションは次のとおりです。

[ -d .svn ] && { svn command 1; svn command 2; } 

関連情報