私がしたいことは次のとおりです。
複数のGitリポジトリがあります。誰にとってもプッシュ配布スクリプトを設定したいと思います。すべてのリポジトリに対してこれを行うには、あまりにも怠惰でスクリプトを書こうとしました。
私のスクリプトは、各リポジトリの受信後にファイルを生成します。
#!/bin/bash
REPOS=/var/opt/gitlab/git-data/repositories/user
for i in $(ls $REPOS)
do
DEPLOY_DIR=/home/user/public_html/"$i"/
POST_RECEIVE_DIR=$REPOS/"$i".git/hooks/post-receive
echo -e '
from, to, branch = ARGF.read.split " "\r
\r
# 3. Copy files to deploy directory\r
deploy_to_dir = File.expand_path('$DEPLOY_DIR')\r
`GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master`\r
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"\r
' > $POST_RECEIVE_DIR
chmod +x $POST_RECEIVE_DIR
done
生成されたファイルで変更された唯一の部分は$ DEPLOY_DIRの場所です。
$DEPLOY_DIR は繰り返すたびに変更されます。
問題は、生成されたすべてのファイルの最後の値が$ DEPLOY_DIRであることです。
デバッグのために、スクリプトのさまざまな場所で変数の値をエコーしてみましたが、すべて目的の出力を生成しました。バッファがフラッシュされない問題かもしれないと思います。だから私はsyncコマンドを使ってみました。 echoの代わりにcatを使ってみました。ファイルをPythonスクリプトにパラメータとして渡してファイルを作成し、バッファをフラッシュしようとしました。
すべて失敗しました。
ベストアンサー1
あなたの質問に答えが隠されています。
echo $variable > file in a loop outputs only the last value of variable
当然、最後の値だけが出力されます。
代わりに答えは
echo $variable >> file in a loop outputs all the values of variable
>
値を追加すると上書きされます>>
。したがって、ループで>のみを使用すると、上書きされ続け、最後の値のみがファイルの末尾に表示されます。
ijaz@ijaz-HP-EliteBook-8560p:~$ echo hi>test1
ijaz@ijaz-HP-EliteBook-8560p:~$ cat test1
hi
ijaz@ijaz-HP-EliteBook-8560p:~$ echo hello>test1
ijaz@ijaz-HP-EliteBook-8560p:~$ cat test1
hello
ijaz@ijaz-HP-EliteBook-8560p:~$ echo hello1>>test1
ijaz@ijaz-HP-EliteBook-8560p:~$ cat test1
hello
hello1
ijaz@ijaz-HP-EliteBook-8560p:~$