2012-05-22 6 views
0

좋은 날로부터 문자열에 대한 안전 한계,BASH 스크립트 - 명령 출력

나는 다음 텍스트를 일부 사후 처리를 수행, SVN UP 명령을 수행하는 콘솔 출력을 캡처하는 비교적 간단한 BASH 스크립트를 쓰고 있어요. 예를 들어

:

예상대로이 작동
#!/bin/bash 
# A script to alter SVN logs a bit 

# Update and get output 
echo "Waiting for update command to complete..." 
TEST_TEXT=$(svn up --set-depth infinity) 
echo "Done" 

# Count number of lines in output and report it 
NUM_LINES=$(echo $TEST_TEXT | grep -c '.*') 
echo "Number of lines in output log: $NUM_LINES" 

# Print out only lines containing Makefile 
echo $TEST_TEXT | grep Makefile 

(예 : 위의 코드에서 주석으로),하지만 난 매우 큰 저장소에서이 작업을 실행 한 경우 무슨 일이 일어날 지 걱정입니다. BASH가 콘솔 명령의 출력을 유지하는 데 사용할 수있는 최대 버퍼 크기에는 한계가 있습니까?

나는 비슷한 질문을했지만 나는 무엇을 찾고 있는지 전혀 모르겠다. 나는 특정 스크립트가 큰 중간 버퍼의 경우에 xargs을 사용해야하는 방법을 읽었으며 콘솔 출력 캡처와 관련하여 비슷한 스크립트가 여기에 적용되는지 궁금합니다.

예 :

# Might fail if we have a LOT of results 
find -iname *.cpp | rm 

# Shouldn't fail, regardless of number of results 
find -iname *.cpp | xargs rm 

감사합니다. 불평하지 않았다

var=$(hexdump /dev/urandom | tee out) 

Bash를 이용한

+0

중복 가능성 (http://stackoverflow.com/questions/1078031/what-is-the-maximum-size-of-an-environment -variable-value) – dogbane

+0

왜'grep -c '. *''대신에'wc -l'을 쓰지 않으시겠습니까? 또한 두 곳에서'echo "$ TEST_TEXT"변수를 인용해야합니다. –

+0

'find -iname * .cpp | rm'은 stdin에서 파일을 가져 가지 않기 때문에 작동하지 않을 것이다. 그러나 왜 우리가 많은 결과를 얻으면 실패 할까? – Kevin

답변

5

; 나는 1G와 23.5M 라인을 조금 넘는 정도로 그것을 죽였다. 출력이 시스템의 메모리에 적합하면 걱정할 필요가 없습니다.

1

여기서 임시 파일을 사용하지 않아도됩니다. [환경 변수 값의 최대 크기는 무엇 η]

tmp_file=$(mktemp XXXXX) 

svn up --set-depth=infinity > $tmp_file 
echo "Done" 

# Count number of lines in output and report it 
NUM_LINES=$(wc -l $tmp_file) 
echo "Number of lines in output log: $NUM_LINES" 

# Print out only lines containing Makefile 
grep Makefile $tmp_file 

rm $tmp_file 
+0

충분히 좋습니다. +1 파일 시스템 (ro)에 쓸 수 없기 때문에이 작업을 수행 할 수 없습니다. 그러나 나는 이것을 TFQ에 명시하지 않았고 내가 제공 한 세부 사항을 고려할 때 유효하다. 감사! – DevNull