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 파일에 쓰려고 합니까?

관련 정보