이 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
}

이것이 사이클의 처리입니다 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

관련 정보