为什么 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
所做的是同样的事情。
如果我直接运行 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
所做的是同样的事情。