如果我直接在bash中运行rg
,输出信息包括找到的文件名(在单独的一行上(,然后在单独的行上为每个匹配项指定行号和内容:
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上运行(
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
做的事情是一样的。