这个 svn 脚本是如何工作的?

这个 svn 脚本是如何工作的?

svn我定义了这个 bash 函数来使用单个命令更新多个项目:

svn_update_all () 
{ 
    repos=`find . -name '.svn'`;
    for i in "$repos";
    do
        svn update `dirname $i`;
        echo;
    done
}

它给出的输出是:

Updating 'project1':
At revision 26713.
Updating 'project2':
At revision 26723.
Summary of updates:
  Updated 'project1' to r26713.
  Updated 'project2' to r26723.

输出Summary of updates有点混乱。每一行都是通过程序的单独调用来打印的。怎样才能有一个统一的总结呢?

答案1

简短的回答:这些不是单独的调用;你只运行svn update一次。

(您可以通过运行 下的函数来测试这一点set -x,这使得 bash 在运行时打印每个命令set -x; svn_update_all; set +x:)

如果你真的想运行svn多次(并且你确定你会绝不路径中有空格),您只需将引号放在$repos

svn_update_all ()
{ 
    repos=`find . -name '.svn'`
    for i in $repos
    do
        svn update `dirname $i`
        echo
    done
}

这是循环的处理forbash(1)说:

为了 姓名[[[单词 ...]]; ] 列表;完毕

以下单词列表被展开,生成一个项目列表。变量姓名依次设置为该列表的每个元素,并且列表每次都会执行。

所以块的内容for每个运行一次单词in。这是一个例子:

count=0
for num in one two three; do
do
    let count++
    echo "loop $count: '$num'"
done
循环1:“一”
循环2:“二”
循环3:“三”

带引号的字符串被视为一个字。这基本上就是您的脚本中发生的事情:

count=0
for num in "one two three"; do
    let count++
    echo "loop $count: '$num'"
done
循环1:“一二三”

删除引号并$repos再次拆分为单独的单词,然后svn update按照您的预期为每个存储库运行一次。

不过请注意:如果你有一条包含空格的路径,这将会中断

最简单的处理路径的方法可能有空格是将 的输出通过管道传输findread内置命令中:

find . -name '.svn' | while read i
do
    svn update `dirname $i`
    echo
done

最安全的方法是使用find's-exec-execdiractions,这样你就不必担心bash分割文件名:

# print the repo dir, then run "svn update" in it
find . -name '.svn' -printf '%h: ' -execdir svn update \;
./mpc:更新“.”:
U trunk/src/pow.c
U trunk/tests/pow.dat
U 中继线/m4/mpc.m4
更新至修订版 1455。
./mpfr:更新“.”:
[ETC]

答案2

删除引号,或管道槽

例如

for i in "a b"
do
echo $i
done

给出作为输出

a b

所以很可能你最终会得到

svn update project1 project2

因此,总结如下。

尝试

find . -name '.svn' |
while read i
do
    svn update `dirname $i`;
    echo;
done

相关内容