当命令替换结果为空时不运行命令

当命令替换结果为空时不运行命令

我有以下代码可以pylint在 Git 存储库中文件扩展名为 的所有文件上运行.py,由命令替换提供。

pylint $(git ls-files '*.py')

除非没有与模式匹配的文件,否则脚本运行得很好。但是,pylint当在没有文件的情况下调用该实用程序时,该实用程序会给出详细的帮助消息,这不是我想要的 - 我pylint根本不想调用。

那么,我可以寻求一些帮助,了解如何在调用之前最好地测试是否有任何文件与文件名模式匹配pylint

我是一个pylint新手bash

答案1

根本不要使用命令替换。相反,使用管道将数据传递给git ls-files,并在生成的文件列表上运行:xargsxargspylint

git ls-files -z '*.py' | xargs -0 -r pylint

git这会将命令中的文件列表xargs作为\0- 分隔列表传递。该xargs实用程序将pylint使用从 读取的名称运行git,但使用 时-r,如果列表为空,则它不会运行该实用程序。

这解决了三个问题:

  1. 通过将路径名作为\0- 分隔列表传递,它支持名称包含换行符和其他空格的文件。
  2. 通过从管道读取并运行pylint尽可能大批量的文件,我们能够处理git ls-files生成大量数据而使用命令替换会因“参数列表太长”而失败的情况。
  3. pylint如果列表为空,则不会运行。

这个答案假设使用xargs具有非标准(但常见)选项-0和 的实现-r

相关内容