Don't print header on stderr

Automated consumers can use 'sed 1d' or similar to remove this header.

This probably makes this output *easier* to consume correctly.  Having
this header show up in consumers' terminal or log output is probably not
useful, but hiding it without hiding all error messages would have been
more troublesome that just stripping it from stdout.

I.e., previously, unsophisticated use would show undesired output:
  $ some-other-tool
  This attribute set contains:
  This attribute set contains:
  This attribute set contains:
  This attribute set contains:
  <Actual some-other-tool output>

The simplest way to hide this undesired output would have been
nixos-option ... 2>/dev/null, which would hide all error messages.
We do not wish to encourage that.

Correct use would have been something like:
  nixos-option ... 2> >( grep --line-buffered -v 'This attribute set contains:')

After this change, correct use is simpler:
  nixos-option ... | sed 1d
or
  nixos-option ... | sed '1/This attribute set contains:/d'
if the caller don't know if this invocation of nixos-option will yield
an attribute listing or an option description.
This commit is contained in:
Chuck 2019-09-16 09:36:00 -07:00 committed by Linus Heckemann
parent 2ddd2d0760
commit 84d55716a9

View file

@ -430,9 +430,7 @@ void printOption(Context & ctx, Out & out, const std::string & path, Value & opt
void printListing(Out & out, Value & v)
{
// Print this header on stderr rather than stdout, presumably to make it
// slightly easier to consume this output in other tools.
std::cerr << "This attribute set contains:\n";
out << "This attribute set contains:\n";
for (const auto & a : v.attrs->lexicographicOrder()) {
std::string name = a->name;
if (!name.empty() && name[0] != '_') {