1

コマンドを実行すると

git cherry origin/Server_Dev

私のgitリポジトリで、フォームのコミットのリストを取得します

+ 95b117c39869a810595f1e169c64e728d2d7443d
+ e126f1b996ecf1d2a8cf744c74daa92cce338123
+ 869169a6cb0bbe8f1922838798580a1e74ec3884
+ 667819b617c88bd886dc2001f612b5c7a4d396c3
+ fd41328a84b0a127affa6fe4328c93e933de378c
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

これは良いことです。

次のコードを使用して、bash スクリプト内からこのコマンドを実行し、出力を配列にキャプチャしたいと考えています。

commit_hashes=(`git cherry origin/Dev`)
echo ${commit_hashes[@]}

次の出力が得られます。

+ 95b117c39869a810595f1e169c64e728d2d7443d + e126f1b996ecf1d2a8cf744c74daa92cce338123 + 869169a6cb0bbe8f1922838798580a1e74ec3884 + 667819b617c88bd886dc2001f612b5c7a4d396c3 + fd41328a84b0a127affa6fe432
8c93e933de378c + cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

これは良いことではありません

コミットのリストが文字列として返されますが、使用する前にまず分割する必要があります。いくつか検索した結果IFS=""、データをキャプチャする前にスクリプトに追加すると、問題が解決することがわかりました。

だから私は自分のコードを編集して読む

IFS=""
commit_hashes=(`git cherry origin/Dev`)
echo ${commit_hashes[@]}

どの出力

+ 95b117c39869a810595f1e169c64e728d2d7443d
+ e126f1b996ecf1d2a8cf744c74daa92cce338123
+ 869169a6cb0bbe8f1922838798580a1e74ec3884
+ 667819b617c88bd886dc2001f612b5c7a4d396c3
+ fd41328a84b0a127affa6fe4328c93e933de378c
+ cfe1807e5d4acc6b5e75f4463dadb3b1c957376f

これで私の現実感は完全になくなりました。

私は物事がなぜそのようなことをしているのかを知りたいので、さらに検索した結果、これは と呼ばれInternal Field Separator、Unix システムでコマンド インタープリターがパターンをトークンに分割する場所を特定するために使用されていることがわかりました。

これはわかります。

わからないのは

  1. この変数を空の文字列に設定すると、配列データを適切に処理できるようになったのはなぜですか。
  2. インタープリターが配列データを処理していることに気づき、それを適切に処理するのではなく、そもそもそのように設定しなければならなかった理由。
  3. デフォルトでは、スペース、タブ、および改行の文字が含まれているため、内部フィールドセパレーターを空の文字列に設定すると、全体のスキームにどのような影響がありますか。

これらの 3 つの点について頭を悩ませるための助けをいただければ幸いです。

4

1 に答える 1

2

man bash/Arraysを参照してください。アレイはすべて問題ありません。あなたがするとき

echo ${commit_hashes[@]}

echoは、指示どおりにすべての配列要素を1行に表示します。あなたが言う時

for i in `seq 10`; do
    echo ${commit_hashes[$i]}
done

1行に1つのエントリのみが表示されていることがわかります。

IFS=ただし、空の文字列に設定すると、の結果はgit cherry複数の値に分割されません。改行を含む文字列全体が最初の配列要素に割り当てられます。もし、あんたが

echo ${commit_hashes[0]}

2番目のケースでは、エコーがすべての出力ラインを示していることがわかります。

于 2012-11-19T11:59:14.107 に答える