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
}
这是循环的处理for
。bash(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
按照您的预期为每个存储库运行一次。
不过请注意:如果你有一条包含空格的路径,这将会中断。
这最简单的处理路径的方法可能有空格是将 的输出通过管道传输find
到read
内置命令中:
find . -name '.svn' | while read i
do
svn update `dirname $i`
echo
done
这最安全的方法是使用find
's-exec
或-execdir
actions,这样你就不必担心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