【问题标题】:Diffrence between $(git ls-files -s | wc -l ) and $(git ls-files -s >out && wc -l <out)$(git ls-files -s | wc -l) 和 $(git ls-files -s >out && wc -l <​​out) 之间的区别
【发布时间】:2017-07-26 17:37:33
【问题描述】:

$(git ls-files -s | wc -l)$(git ls-files -s &gt;out &amp;&amp; wc -l &lt;out)这两个命令是不同还是相同, 当 first 以第二种形式编写时,我最终得到了错误。

【问题讨论】:

  • 顺便说一句——而不是仅仅说你“遇到错误”,提供看到的 exact 错误可以帮助人们根据你的具体情况定制答案。 (当然,如果您在同一个目录中同时运行多个副本,则会出现令人惊讶的结果,因为第二个开始会截断第一个创建的 out 文件。
  • ...顺便说一句,周围的$()s 意味着您正在获取wc -l 的输出,并将该输出作为命令本身运行,如果这就是您正在运行的命令的全部内容(与分配相反,即var=$(...))。当然,这将是一个错误,但在这两种情况下都会出现这种情况。

标签: linux git sh git-ls-files


【解决方案1】:

当您将一个程序的输出通过管道传输到另一个程序的输入时,如下所示:

$(git ls-files -s | wc -l)

...程序同时运行。 wc 将在收到行数后立即开始计数。该管道还将git 的输出定向到wc 的输入,而无需任何中间文件。

请注意,在这种情况下,即使 git 命令由于某种原因失败,wc 也会运行,因此您将获得 wc 输出(在大多数情况下,0)。

在你的第二个例子中:

$(git ls-files -s >out && wc -l <out)

...git 命令首先运行,并将其结果存储在名为out 的文件中。然后,如果成功,wc 会运行并计算行数。因为&amp;&amp;,如果git 命令失败,wc 根本不会运行。无论哪种情况,您都会有一个名为out 的文件,其中包含git 命令的结果。

管道通常更好;它会运行得更快,如果你不需要保留中间结果,它不会有任何副作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2021-08-20
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2013-10-22
    相关资源
    最近更新 更多