这就是我想做的:
我有几个 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 的 LAST 值。
为了调试,我尝试在脚本中的各个位置回显变量值,它们都会产生所需的输出。我认为这可能是缓冲区未刷新的问题。所以我尝试使用同步命令。我尝试使用 cat 而不是 echo 。我尝试将文件作为参数传递给 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
在我看来,您在某处有引用错误。
尝试使用“此处文档”输出脚本:
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 文件?