If I run rg
in bash directly, the output information includes the found file names (on a separate line), and then on a separate line for each match the line number and content for that match:
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:
But if I run the same command from python subprocess
run, the displayed information of the matched results includes the filename on each line and do not include a line number. Why is that so? (I am running on 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:',
'']
Because ripgrep detects if an interactive tty exists on stdout, and if so, changes the output format to be more "friendly." It's the same thing that ls
does for example.