为什么 python 子进程 运行 的 ripgrep 结果不同于 shell 中的 rg 运行

Why ripgrep results from python subprocess run differ from rg run in the shell

如果我直接运行 rg in bash,输出信息包括找到的文件名(单独一行),然后单独一行匹配该匹配项的行号和内容:

11:38 (main *+) durl $ rg format
durl/__main__.py
35:            print(util.format_output(repo.url, line))
38:            print(util.format_output(repo.url, line, linenumber=n))

durl/util.py
15:def format_output(prefix, filename: str, linenumber: str=None) -> str:

但是如果我运行从pythonsubprocess运行执行相同的命令,匹配结果的显示信息包括每一行的文件名和不要包括行号。为什么? (我在 MacOS 上 运行ning)

11:38 (main *+) durl $ ipython
Python 3.9.5 (default, May  4 2021, 03:36:27)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.27.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import subprocess

In [2]: p = subprocess.run('rg format', text=True, shell=True, capture_output=True,)

In [3]: p.stdout
Out[3]: 'durl/__main__.py:            print(util.format_output(repo.url, line))\ndurl/__main__.py:            print(util.format_output(repo.url, line, linenumber=n))\ndurl/util.py:def format_output(prefix, filename: str, linenumber: str=None) -> str:\n'

In [4]: p.stdout.split('\n')
Out[4]:
['durl/__main__.py:            print(util.format_output(repo.url, line))',
 'durl/__main__.py:            print(util.format_output(repo.url, line, linenumber=n))',
 'durl/util.py:def format_output(prefix, filename: str, linenumber: str=None) -> str:',
 '']

因为 ripgrep 检测 stdout 上是否存在交互式 tty,如果存在,则将输出格式更改为更“友好”。例如,ls 所做的是同样的事情。