2012-05-22 189 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 

謝謝。

+0

可能重複[什麼是環境變量值的最大值?](http://stackoverflow.com/questions/1078031/what-is-the-maximum-size-of-an-environment -variable-value) – dogbane

+0

爲什麼不使用'wc -l'而不是'grep -c'。*''?另外,你應該引用你的變量:'echo「$ TEST_TEXT」'在這兩個地方。 –

+0

'find -iname * .cpp | rm'將不起作用,因爲rm不會從stdin中獲取文件,但爲什麼你認爲它「如果我們有很多結果可能會失敗」? – Kevin

回答

5

使用

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

的bash沒有抱怨;我在1G和2350萬線上殺了它。只要您的輸出適合您的系統內存,就不用擔心。

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