私がやっている学生の仕事の退屈な部分を自動化しようとしています。
デフォルトでは、目標は複数のgitリポジトリ(私はすでに職場にいる)を複製し、すべてのリポジトリに対して同じgitチェックアウトを実行することです。毎回次のメッセージを受け取ります。
`git rev-list -n 1 --before="2016-04-29 23:59" master`
git checkoutで提供されます。私はすべてを私のスクリプトに渡してチェックアウトを実行できるようにしたいと思います。現在私のスクリプトは
#!/bin/bash
echo $1
(最初はもっと複雑でしたが、後でこの入力に集中できるように、他のすべてをコメントアウトしました。)
スクリプトを実行しようとすると、次のようになります。
./RepoScan `git rev-list -n 1 --before="2016-04-29 23:59" master`
次のエラーが発生します。
fatal: Not a git repository (or any of the parent directories): .git
その後、改行文字が続きます。私はこれがgit rev-listがRepoScanに渡されるのではなく実行しようとしていることを意味すると思います。引数として渡されたときには実行されませんが、スクリプトによって引き続き実行されるようにこれをパッケージ化する方法はありますか?
(また重要な場合はOSXを使用しています。)
ベストアンサー1
バックティックで区切られたコマンドの置き換え:バックティック内でコマンドを実行し、その出力をコマンドラインに挿入します。 (バックティックが二重引用符内にない場合はより複雑になります。詳細については後で説明します。)したがって、git rev-list …
実行される前に現在のディレクトリで実行されます。コマンドの出力はに引数として渡されるので、そうでRepoScan
はありません。git
RepoScan
呼び出し時に指定したコマンドを実行するには、RepoScan
次のパスを渡す必要があります。コマンドRepoScan
そのコマンドの出力ではなく、コマンドラインに表示されます。コマンドの意味に応じてこれを行うには2つの方法があります。
パラメータを含む実行可能ファイルを渡す
コマンドをいくつかのパラメーターを持つ実行可能ファイルとして解釈するには、コマンドを次のように渡します。単語リスト。
./RepoScan git rev-list -n 1 --before="2016-04-29 23:59" master
RepoScan
スクリプトでは、"$@"
を使用してコマンドを参照してください。この@
記号はパラメータのリストを表す特殊変数です。二重引用符内で使用するときに特別な動作があります。各引数は別々の単語に配置されます"$@"
。リスト議論。
コマンドが別のオプションを使用している場合は、そのRepoScan
オプションをすべてコマンドの前に渡す必要があります。shift
組み込み関数を使用して、コマンドラインの先頭から処理されたオプションを削除します。あなたは一般的に使用しますgetopts
組み込みの解析オプション。
シェルピースの伝達
別の可能性は、シェルの断片を単一の引数として渡すことです。
./RepoScan 'git rev-list -n 1 --before="2016-04-29 23:59" master'
この参照の2つのレベルに注意してください。一重引用符は、呼び出すシェルに使用されますRepoScan
。一重引用符内のすべての内容は文字通り解釈されるため、RepoScan
文字列である引数が1つ得られますgit rev-list -n 1 --before="2016-04-29 23:59" master
。内部にはRepoScan
シェル片があるので、以下を使用してください。
eval "$1"
フラグメントが最初の引数にある場合、または
eval "$command"
コードスニペットが変数にある場合command
。
変数拡張の周りの二重引用符に注意してください。。$foo
外部二重引用符は、「値foo
」を意味するのではなく、「値を取得してパターンリストfoo
に従って分割しIFS
、結果をglobとして解釈する」(split + glob演算子とも呼ばれる)を意味するため、これが必要です。