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: "2" 루프 3: "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
이를 수행하는 방법은 -exec
또는 작업을 사용하여 파일 이름 분할 -execdir
에 대해 걱정할 필요가 없도록 하는 것입니다 .bash
# print the repo dir, then run "svn update" in it
find . -name '.svn' -printf '%h: ' -execdir svn update \;
./mpc: "." 업데이트: U 트렁크/src/pow.c U 트렁크/테스트/pow.dat U 트렁크/m4/mpc.m4 개정판 1455로 업데이트되었습니다. ./mpfr: "." 업데이트: [등]
답변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