echo $variable > ループ内のファイルは、変数の最後の値のみを出力します。

echo $variable > ループ内のファイルは、変数の最後の値のみを出力します。

私がしたいことは次のとおりです。
複数の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:~$ 

答え2

どこかに引用エラーがあるようです。

Document Here 出力スクリプトを試してください。

    cat <<__EOF >"$POST_RECEIVE_DIR"
from, to, branch = ARGF.read.split " "

# 3. Copy files to deploy directory
deploy_to_dir = File.expand_path('$DEPLOY_DIR')
GIT_WORK_TREE="#{deploy_to_dir}" git checkout -f master
puts "DEPLOY: master(#{to}) copied to '#{deploy_to_dir}'"
__EOF

そしてsはどうしたの\r? DOSファイルに書き込もうとしますか?

関連情報