> Ну почему: можно пайпить в какой-нибудь jq или что-то подобное. Это едва
> ли всегда будет удобнее, чем стандартная связка из возможностей shell +
> sed + awk, но иногда может быть и удобнее.Можно, но на мой взгляд, это будет все равно костыль/полумера - передаем через пайп данные в виде текста, только в дополнительной обертке + с сильным оверхедом, да еще и только для вывода данных - "скормить" вывод в пайп следующей стандартной утилите без доп. обработки не получится.
Хотя, с другой стороны, задумано libxo вообще-то для "форматированного вывода" - с чем оно, имхо, прекрасно справляется.
> У меня к этому другая претензия: очень часто это попахивает оверинжинирингом.Например, зачем это в ls или в том же wc?
> Примерно все языки позволяют тривиально воспроизводить функционал ls и wc (и тому
> подобное).
> Точно ли нужно вкорячивать это в стандартные утилиты, а не написать нужную
> тебе логику на нужном тебе ЯП?
А вот тут я не согласен - посмотрите на реализацию этого в wc (в ls как раз еще не встроили)
https://github.com/freebsd/freebsd/blob/master/usr.bin/wc/wc.c
if (doline)
xo_emit_h(xop, " {:lines/%7ju/%ju}", linect);
if (doword)
xo_emit_h(xop, " {:words/%7ju/%ju}", wordct);
if (dochar || domulti)
xo_emit_h(xop, " {:characters/%7ju/%ju}", charct);
if (dolongline)
xo_emit_h(xop, " {:long-lines/%7ju/%ju}", llct);
if (file != NULL)
xo_emit_h(xop, " {:filename/%s}\n", file);
и сравните с
https://github.com/wertarbyte/coreutils/blob/master/src/wc.c
(в котором кстати в 2 раза больше строк кода ;) )
if (print_lines)
{
printf (format_int, number_width, umaxtostr (lines, buf));
format_int = format_sp_int;
}
if (print_words)
{
printf (format_int, number_width, umaxtostr (words, buf));
format_int = format_sp_int;
}
if (print_chars)
{
printf (format_int, number_width, umaxtostr (chars, buf));
format_int = format_sp_int;
}
Т.е. никаких особых усложнений нет, зато предоставлется одинаковый формат вывода утилит.