【问题标题】:What does && do in redirecting an output to a file?&& 在将输出重定向到文件时做了什么?
【发布时间】:2013-01-16 14:15:17
【问题描述】:

我找到了一个 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

但这没有用。

我想问一下&&这个符号是做什么的,为什么上面一行没有把输出传递给文件。

【问题讨论】:

  • 你问这个问题已经三个月了。请考虑将答案标记为正确或评论未回答的原因。

标签: bash unix redirect


【解决方案1】:

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 聪明人。甚至没有注意到。这应该可以解决您的问题。
    【解决方案3】:

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

    在这种情况下,仅当左侧成功时才执行右侧。 IE。如果 egrep 确实报告了一个空行,它只会打印出 'blank line at the ...'。

    【讨论】:

      【解决方案4】:

      正如其他人所说的 && 是短路和运算符:

      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循环的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 2013-10-11
        • 2023-03-19
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多