いくつかの種類の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の両方を印刷する必要があります。
戻りコードを自動的にチェックする場合:
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
を使用して1回実行できます。
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
は、ファイル記述子を再度復元します。その間のすべてがどこにもリダイレクトされません。
Gillesが提案したように、他のリポジトリチェックを追加します。
他の人がすでに述べたように、if command
は、command
が成功するかどうかをテストします。実際には [ … ]
は通常のコマンドであり、一般的ではありませんが、if
またはwhile
条件外で使用できます。
ただし、このアプリケーションでは、特徴的なディレクトリの存在をテストします。これは、より多くのEdgeケースで正しくなります。 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
まあ、それはそれほどきれいではありませんが、インラインで行う1つの方法です。
if darcs show repo > /dev/null 2>&1; then <do something>; fi
定義により、ifはコマンドの終了コードをテストするので、成功または失敗以上のものを必要としない限り、明示的な比較を行う必要はありません。これを行うには、おそらくもっとエレガントな方法があるでしょう。
別の簡潔なオプションは次のとおりです。
[ -d .svn ] && { svn command 1; svn command 2; }