echo $ variável em um loop gera apenas o último valor da variável

0

Veja o que estou tentando fazer:
Eu tenho vários repositórios git. Eu quero configurar um script push-to-deploy para cada um deles. sendo tão preguiçoso para fazer isso para cada repo, eu queria fazer um script.

Meu script gera um arquivo de pós-recebimento para cada repositório.

#!/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

Observe que a única parte que muda no arquivo gerado é onde $ DEPLOY_DIR se encontra.
E $ DEPLOY_DIR muda a cada iteração.
O problema é: TODOS os arquivos gerados têm o valor LAST de $ DEPLOY_DIR.

Para depurar, tentei ecoar os valores das variáveis em vários lugares no script e todos eles produzem as saídas desejadas. Eu pensei que poderia ser um problema com os buffers não sendo liberados. então eu tentei usar o comando sync. Eu tentei usar gato em vez de eco. Eu tentei passar o arquivo como um parâmetro para um script python onde eu escrevo no arquivo e libero o buffer.

Todos não funcionaram.

    
por Adam Zahran 01.01.2016 / 18:59

2 respostas

1

A resposta está oculta na sua pergunta.

 echo $variable > file in a loop outputs only the last value of variable

produzirá, obviamente, apenas o último valor.

em vez disso, a resposta é

echo $variable >> file in a loop outputs all the values of variable

> sobrescreve um valor enquanto >> o anexa. Portanto, se você estiver usando apenas > em um loop, ele continuará sobrescrevendo, e somente o último valor estará lá no arquivo no final

     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:~$ 
    
por 01.01.2016 / 20:21
0

Parece-me que você tem um erro de citação em algum lugar.

Tente usar um "documento aqui" para gerar o script:

    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

Além disso, o que há com o \r s? Você está tentando gravar arquivos do DOS?

    
por 01.01.2016 / 19:10