2013-01-16 59 views
1

我發現了一個bash script,它列出了在文件的開頭或結尾處有空行的所有文件。將輸出重定向到文件時會發生什麼?

for f in `find . -type f`; do 
    for t in head tail; do 
    $t -1 $f |egrep '^[ ]*$' >/dev/null && echo "blank line at the $t of $f" ; 
    done; 
done 

我想將輸出傳遞給一個文件。我將echo行更改爲:

$t -1 $f |egrep '^[ ]*$' >/dev/null && echo "blank line at the $t of $f" > blank_lines.log 

但是,這並沒有奏效。

我想問一下符號&&是做什麼的,以及爲什麼上面的行不會將輸出傳遞給文件。

+0

它已經三個月了,你問的問題。請考慮將答案標記爲正確或者評論未答覆的答案。 –

回答

5

這不會重定向輸出,它會添加另一個命令來執行當且僅當第一個成功。 I。command1 && command2表示執行command1,如果它成功執行command2。當且僅當兩個命令都成功時,執行此語句的結果纔是成功的。

3

這是一個短路的'和'運營商。它不參與輸出重定向。

在此情況下,只有在左側成功時才執行右側。即如果真的有egrep報道的空白行,它只會打印出'...的空白行'。

2

如由其他人& &提到是短路和操作員:

command1 && command2 

執行命令1,並且如果該命令沒有沒有錯誤運行(退出代碼0)執行命令2。然後它返回command2的退出碼。

echo "foo" > /dev/null && echo "bar" > tmp.txt 

確實有效,所以你的腳本不工作的原因應該是別的。 也許嘗試執行

$t -1 $f |egrep '^[ ]*$' >/dev/null && echo "blank line at the $t of $f" > blank_lines.log 

沒有變量和for循環的行。

2

重定向不起作用的原因是您使用了>來重定向輸出。在寫入命令的輸出之前,這個會清除文件,這意味着您只能看到最後寫入的內容。要解決此問題,請使用>>進行追加(儘管您可能需要在開始時截斷文件以防止多次腳本運行的輸出累積),或者重定向整個循環的輸出。

順便說一句,for ... find構造你用來遍歷文件將失敗如果任何文件名中有空格或其他有趣的角色。這是更好的使用find ... -print0 | while IFS= read -d $'\0' ...(然後用周圍$f雙引號):

find . -type f -print0 | while IFS= read -d $'\0' f; do 
    for t in head tail; do 
     $t -1 "$f" |egrep '^[ ]*$' >/dev/null && echo "blank line at the $t of $f" 
    done 
done > blank_lines.log 
+0

聰明的人。甚至沒有注意到。 這應該可以解決你的問題。 –