When I run the ag command to search text files, I get output that looks like this on the command line (full results not shown):

❯ ag dependency
27:The Bundler dependencies API ...

61:`distutils` is part of the Python standard ....

There are newlines in the output. However, when I pipe or redirect to a file, I get output like this:

140317155505.md:27:The Bundler dependencies API...
140423193022_python_packages.md:61:`distutils` is part of the Python standard...

Here there is an extra colon instead of a newline. How does this work? I would think that ag just writes to STDOUT and is unaware of the actual target of STDOUT-- am I wrong in thinking that it does not have access to this information?

2 Answers 2


I got here by Google and didn't quite find the answer I was looking for: you can invoke ag as

ag --color --group

to force it to use the default colors and group results by file, regardless of whether the output is a tty.

Here's what it looks like in action.


The program ag (I'm not familiar with it), could use the system call

stdout_is_tty = isatty(1);

The isatty() function tests whether fd is an open file descriptor referring to a terminal.

This allows it to modify the output depending on where it is writing to.

I also think I found the relevant source code section

/* If we're not outputting to a terminal. change output to:
* turn off colors
* print filenames on every line
if (!isatty(fileno(stdout))) {
  opts.color = 0;
  group = 0;

See also man isatty.

  • awesome, wish I give bonus points for the source code citation! Sep 28, 2014 at 22:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.