2

我找到了一个 bash脚本,它列出了在文件开头或结尾处有一个空行的所有文件。

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

但这没有用。

我想问一下符号的&&作用以及为什么上面的行没有将输出传递给文件。

4

4 回答 4

5

这不会重定向输出,它会添加另一个命令以执行当且仅当第一个命令成功时。即command1 && command2表示执行command1,如果成功则执行command2。此外,当且仅当两个命令都成功时,执行此语句的结果才是成功。

于 2013-01-16T14:16:42.400 回答
3

重定向不起作用的原因是您曾经>重定向输出。这会在将命令的输出写入文件之前擦除文件,这意味着您只会看到最后写入的内容。要解决此问题,请使用>>附加(尽管您可能需要在开头截断文件以防止多次运行脚本累积的输出),或重定向整个循环的输出。

顺便说一句,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
于 2013-01-16T15:37:28.337 回答
3

这是一个短路的“与”运算符。它不参与输出重定向。

在这种情况下,它仅在左侧成功时才执行右侧。即,如果 egrep 确实报告了一个空白行,它只会打印出“...处的空白行”。

于 2013-01-16T14:16:59.640 回答
2

正如其他人所提到的 && 是一个短路和运算符:

command1 && command2

执行 command1,如果该命令运行时没有错误(退出代码 0),则执行 command2。然后它返回 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循环的行。

于 2013-01-16T15:12:20.433 回答